当我编译下面的代码时,SBCL抱怨g!-unit-value和g!-unit是未定义的.我不知道如何调试这个.据我所知,flatten失败了.
当展平到达defunits的未引用部分时,似乎整个部分被视为原子.这听起来不对吗?
以下使用Let over Lambda一书中的代码:
保罗格雷厄姆公用事业
(defun symb (&rest args)
(values (intern (apply #'mkstr args))))
(defun mkstr (&rest args)
(with-output-to-string (s)
(dolist (a args) (princ a s))))
(defun group (source n)
(if (zerop n) (error "zero length"))
(labels ((rec (source acc)
(let ((rest (nthcdr n source)))
(if (consp rest)
(rec rest (cons (subseq source 0 n) acc))
(nreverse (cons source acc))))))
(if source (rec source nil) nil)))
(defun flatten (x)
(labels ((rec (x acc)
(cond ((null x) acc) …Run Code Online (Sandbox Code Playgroud) 在 Common Lisp 中,如果我希望两个函数共享状态,我将执行let over lambda,如下所示:
(let ((state 1))
(defun inc-state ()
(incf state))
(defun print-state ()
(format t "~a~%" state))
Run Code Online (Sandbox Code Playgroud)
这些函数不是本地函数let- 它们是全局函数,维护对共享状态变量的引用,该变量本身从外部不可见。例如,我可以在代码中的其他位置执行以下操作:
(print-state) => 1
(inc-state) => 2
(print-state) => 2
Run Code Online (Sandbox Code Playgroud)
然而,在Scheme中,这样的构造声明了从外部不可见的局部函数:
(let ((state 1))
(define (print-state)
(print state))
(print-state)) => 1
(print-state) => error, no such variable print-state
Run Code Online (Sandbox Code Playgroud)
我认为实现这种功能的唯一方法(除了在模块内使用未导出的全局变量之外)是这样的:
(define print-state #f)
(define inc-state #f)
(let ((state 1))
(set! print-state (lambda () (print state)))
(set! inc-state (lambda () (inc! state))))
Run Code Online (Sandbox Code Playgroud)
在Scheme中是否有一种方法可以编写 …