如何解决图雷茨基的 Dtrace
我正在尝试通过 Touretzky 撰写的“Common LISP a Gentle Introduction to Symbolic Computation”一书来学习 lisp。书中有一个实用程序,Dtrace(我使用 dtrace.generic)。使用 dtrace 的示例:
(defun add-to-end (x y)
(append x (list y)))
(defun repeat-first (phrase)
(add-to-end phrase (first phrase)))
> (dtrace add-to-end repeat-first)
(ADD-TO-END REPEAT-FIRST)
> (repeat-first ’(for whom the bell tolls))
----Enter REPEAT-FIRST
| PHRASE = (FOR WHOM THE BELL TOLLS)
| ----Enter ADD-TO-END
| | X = (FOR WHOM THE BELL TOLLS)
| | Y = FOR
| \--ADD-TO-END returned
| (FOR WHOM THE BELL TOLLS FOR)
\--REPEAT-FIRST returned
(FOR WHOM THE BELL TOLLS FOR)
(FOR WHOM THE BELL TOLLS FOR)
不幸的是在 Clozure(在 Win7 上)结果是:
? (repeat-first '(for whom the bell tolls))
----Enter REPEAT-FIRST
| Arg-1 = (FOR WHOM THE BELL TOLLS)
| ----Enter ADD-TO-END
| | Arg-1 = (FOR WHOM THE BELL TOLLS)
| | Arg-2 = FOR
| \--ADD-TO-END returned (FOR WHOM THE BELL TOLLS FOR)
\--REPEAT-FIRST returned (FOR WHOM THE BELL TOLLS FOR)
(FOR WHOM THE BELL TOLLS FOR)
函数参数名称丢失。它应该依赖于 fetch-arglist 函数。基于这个 answer,我将 fetch-arglist 写成:
(defun fetch-arglist (x) (arglist x))
事实上:
? (arglist #'add-to-end)
(X Y)
:ANALYSIS
不幸的是,结果是一样的。在 Clozure 中,有没有办法让函数的参数名称出现在 dtrace 中?
更新: 解决方案是(在 dtrace.generic 中):
(defun fetch-arglist (x) (ccl:arglist x))
更新 2: dtrace 将奇怪的结果打印为:
((CCC (? AAA . #1=(0)) (? BBB . #1#)))
虽然 Clozure 的痕迹打印正确:
((CCC (? AAA 0) (? BBB 0)))
Update3(希望是最后一次): 由于 Vsevolod Dyomkin 的解决方案:
(defparameter *dtrace-print-circle* nil)
*print-circle*
显示 common substructure:
CL-USER> (setf *print-circle* t)
T
CL-USER> (let ((l '((a b c) (d e f))))
(list l (copy-list l)))
;=> ((#1=(A B C) #2=(D E F)) (#1# #2#))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。