Common lisp GNU CLISP中的堆栈溢出(&;不在SBCL中)

Common lisp GNU CLISP中的堆栈溢出(&;不在SBCL中),common-lisp,clisp,Common Lisp,Clisp,我用下面的代码得到了堆栈溢出,然后我在SBCL中尝试了它,它成功了。想知道是什么原因造成了这种差异 具体来说:虽然我确实计划在某个时候搬到SBCL,但我可以 这可以在CLISP中使用吗 (defvar*objs*nil);[1] (defun parents(obj)(gethash:parents obj)) (defun obj(和其他家长);[2] (let((obj(生成哈希表))) (推送obj*objs*) (setf(父母obj)父母) (obj) (defun(setf父母)(v

我用下面的代码得到了堆栈溢出,然后我在SBCL中尝试了它,它成功了。想知道是什么原因造成了这种差异

具体来说:虽然我确实计划在某个时候搬到SBCL,但我可以 这可以在CLISP中使用吗

(defvar*objs*nil);[1]
(defun parents(obj)(gethash:parents obj))
(defun obj(和其他家长);[2]
(let((obj(生成哈希表)))
(推送obj*objs*)
(setf(父母obj)父母)
(obj)
(defun(setf父母)(val obj);[3]
(prog1(setf(gethash:parents obj)val)
(优先于obj)
(定义优先权(obj);[4]
(setf(gethash:preclistobj)(优先obj))
(dolist(x*objs*)
(if(成员obj(gethash:preclist x))
(setf(gethash:preclist x)(优先级x(()())))
(定义优先级(obj);[5]
(删除重复项(遍历对象)))
(defun导线测量(x);[6]
(cons x(mapcan#'遍历(gethash:parents x)))
;; [1] 我们将在*obj*中存储创建的对象列表。
;; [2] 函数创建一个名为like(setf恶棍(obj))的对象。
;; [3] 为所有受影响的OBJ设置对象(多个)父对象和重建优先级列表。
;; [4] 为obj重建优先级列表,然后为所有受影响的obj重建优先级列表。
;; [5] 按我们定义的优先顺序返回对象及其所有祖先的列表。
;;     (如果有帮助,可以像(->obj traverse delete duplicates)一样读取)
;; [6] 递归地将对象约束到其所有父对象;深度优先搜索。
;;     为了清晰性和可测试性,我从标签中优先选择了它。
;; 来源:PG的ANSI通用Lisp,第17章,“示例:对象”。
示例-SBCL

(setf无赖(obj))
; #
(setf sc2(obj无赖))
; #
*objs*
; (#
;  #)
(父母恶棍)
; 无
; T
(家长sc2)
; (#)
; T
示例-GNU CLISP

(setf无赖(obj))
;; - Lisp堆栈溢出。重置
*objs*
;; - Lisp堆栈溢出。重置
值得一提的是,我还没有对lisp的双重性质进行过很多研究。到目前为止,我只是把它当作一种解释语言来使用;通过将上述函数粘贴到clisp repl中


所以我猜想编译所有这些功能可能是一件需要考虑的事情。我注意到我们可以编译和编译文件,但我看不到编译所有用户定义函数的操作符。

GNU CLISP默认打印哈希表的内容。在您的例子中,它包含圆形结构

  • *PRINT-CIRCLE*
    设置为T,以启用打印循环结构而不会出现堆栈溢出
  • 或者将
    *PRINT-ARRAY*
    *PRINT-readable*
    设置为NIL,以禁用打印哈希表的内容
>(setq*打印圆*nil*打印数组*nil*可读打印*nil)
无
>*objs*
(#)

GNU CLISP默认情况下打印哈希表的内容。在您的例子中,它包含圆形结构

  • *PRINT-CIRCLE*
    设置为T,以启用打印循环结构而不会出现堆栈溢出
  • 或者将
    *PRINT-ARRAY*
    *PRINT-readable*
    设置为NIL,以禁用打印哈希表的内容
>(setq*打印圆*nil*打印数组*nil*可读打印*nil)
无
>*objs*
(#)

太棒了。非常感谢你!解决了的。我坚持用CLISP:)太好了。非常感谢你!解决了的。我坚持用CLISP:)
> (setq *print-circle* t)
T
> *objs*
(#1=#S(HASH-TABLE :TEST FASTHASH-EQL (:PRECLIST . (#1#)) (:PARENTS . NIL)))
> (setq *print-circle* nil *print-array* nil *print-readably* nil)
NIL
> *objs*
(#<HASH-TABLE :TEST FASTHASH-EQL :COUNT 2 #x000335098D40>)