gpt4 book ai didi

scope - 在本地环境中定义和访问变量

转载 作者:行者123 更新时间:2023-12-01 08:07:24 26 4
gpt4 key购买 nike

经过一段时间的学习 CL 并在不同的小项目中作为业余爱好练习,我的个人 CL map 上仍然有一些空白区域。最近,我有许多函数都使用相同的 let 结构,我想写一个宏来使代码更简洁:

(defmacro with-context (&body body)
`(let ((context (make-array 4 :element-type 'fixnum
:initial-contents '(0 1 2 3))))
,@body))

这样我以后就可以像这样定义函数(只是作为一个最小的例子):

(defun test-a ()
(with-context
(setf (aref context 3)
(+ (aref context 0) (aref context 1)))
context))

现在我想知道是否可以使用像 (context n) 这样的宏/函数来缩短 (aref context n) 表达式。

(defun context (n)
(aref context n))

当然,变量 context 在编译时是未知的。我只是不知道我在这里是否存在基本误解,或者我如何告诉 lisp 我真正想要的是什么。所以,我的问题基本上是这是否可能以及这是否是个好主意。

最佳答案

局部函数有什么问题?

(defmacro with-context (&body body)
`(let ((context (make-array 4 :initial-contents '(0 1 2 3))))
(flet ((context (n)
(aref context n)))
,@body)))

设置也是:

(defmacro with-context (&body body)
`(let ((context (make-array 4 :initial-contents '(0 1 2 3))))
(flet ((context (n)
(aref context n))
((setf context) (new n)
(setf (aref context n) new)))
,@body)))

关于scope - 在本地环境中定义和访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56770895/

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