gpt4 book ai didi

lisp - lisp 函数可以返回引用或通过引用接收参数吗?

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

我想知道这是如何工作的:

(setf (car x) 42)

(car x) 是否返回对 setf 的可分配引用?或者这只是宏观魔法? setf 或 car 是如何工作的?

我知道通过引用传递在函数式编程中是一个可怕的错误,但我想知道上面是如何完成的。

最佳答案

这是宏观魔法。形式 (setf place value) 只不过是一个专门的宏扩展。例如,(setf (car x) 42) 会被翻译成这样:(rplaca x 42)。

您可以看到您的 Lisp 实现如何使用 MACROEXPAND 扩展 SETF 形式,就像这样(我的示例使用 SBCL,其他实现可能具有完全不同的扩展):

CL-USER> (macroexpand '(setf (aref foo 10) 1234))
(SB-KERNEL:%ASET FOO 10 1234)
T

您还可以定义自己的扩展:

CL-USER> (defvar *value* 0)
*VALUE*
CL-USER> (defun get-value () *value*)
GET-VALUE
CL-USER> (defun (setf get-value) (x) (setq *value* x))
(SETF GET-VALUE)
CL-USER> (setf (get-value) 42)
42
CL-USER> (get-value)
42
CL-USER> (macroexpand '(setf (get-value) 23))
(LET* ()
(MULTIPLE-VALUE-BIND (#:NEW1058) 23 (FUNCALL #'(SETF GET-VALUE) #:NEW1058)))
T

关于lisp - lisp 函数可以返回引用或通过引用接收参数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5641845/

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