gpt4 book ai didi

macros - 在方案中定义全局闭包的标准方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-03 18:41:25 25 4
gpt4 key购买 nike

所以我想知道是否有这样的代码的标准方法:

(let ((x 10))
(define (add10 a)
(+ x a)))

我知道:

(define add10 (let ((x 10))
(lambda (a) (+ x a))))

但是如果我想定义多个函数,这将不起作用,我需要知道标准方法,这样我才能编写定义函数的宏。你可以在 let 中调用宏:

(let ((x 10))
(macro x))

例如,宏将创建函数列表:

(let ((x 10))
(define (add1)
(+ x 1))
(define (add2)
(+ x 2))
(define (add3)
(+ x 3)))

是否有定义函数 add1..add3 的标准方法?在我测试的方案中,这些函数将在 let 内部进行本地化处理,并且在外部无法访问。

如果你显示宏代码,我只对带有 define-macroquasiquote 的 lisp 宏感兴趣,请不要使用 define-syntax,因为这主要用于我自己的 lisp(基于方案),我只有 lisp 宏。

如果 scheme 不支持这样的东西,那么像 Common Lisp 这样的其他方言是否允许这样的东西?

最佳答案

(let ((x 10))
(somemacro x))

->

(let ((x 10))
(define (add1)
(+ x 1))
(define (add2)
(+ x 2))
(define (add3)
(+ x 3)))

在普通 Lisp 中:

CL-USER 43 > (defmacro somemacro (var)
`(progn
(defun add1 () (+ ,var 1))
(defun add2 () (+ ,var 2))
(defun add3 () (+ ,var 3))))
SOMEMACRO

CL-USER 44 > (let ((x 10))
(somemacro x))
ADD3

CL-USER 45 > (add1)
11

CL-USER 46 > (add3)
13

人们有时会看到这一点。一般来说,这在 Common Lisp 中是有点糟糕的风格,因为文件编译器将无法识别全局函数声明,因为在 LETDEFUN 不在 < em>顶级。如果一个函数在顶级的文件中定义,那么在编译时文件编译器会看到这是一个函数,并且可能会做一些特殊的事情,比如在编译时环境中记录签名,内联它。等等

请注意,当 Scheme 中的 DEFINE 定义了一个本地函数时,仍然可能能够做到(取决于实现对标准的补充):

(let ((x 10))
()
(define (add1) (+ x 1)))

请注意,在 Common Lisp 中,defun 定义全局函数,而 flet/labels 定义局部函数。

关于macros - 在方案中定义全局闭包的标准方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55865449/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com