标签: let-over-lambda

写宏的宏 - 编译错误

当我编译下面的代码时,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)

macros common-lisp backquote let-over-lambda

9
推荐指数
1
解决办法
340
查看次数

在Scheme中让-over-lambda?

在 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中是否有一种方法可以编写 …

lambda scheme chicken-scheme let-over-lambda

5
推荐指数
1
解决办法
1320
查看次数