gpt4 book ai didi

LISP 将变量名与字符串连接起来

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

我想知道我是否可以在 Lisp 中做这样的事情:

我需要声明 n 个变量。所以他们将是 n1,n2,n3...等

(dotimes (i n) (setq (+ 'n i))

这可能吗?

最佳答案

Rainer Joswig 在评论中指出,您获得的代码不适用于您尝试执行的操作,并解释了原因。如果您尝试以编程方式声明 变量,您将需要源代码操作,这意味着您需要一个宏。在这种情况下,这很容易。我们可以定义一个宏with-indexed-vars,它接受一个符号、一个数字和一个主体,并扩展为一个包含您期望的变量的let,并且在该范围内评估主体:

(defmacro with-indexed-vars ((var n) &body body)
"Evalutes BODY within a lexical environment that has X1...XN
declared as variables by LET. For instance

(with-indexed-vars (x 5)
(list x1 x2 x3 x4 x5))

expands to

(LET (X1 X2 X3 X4 X5)
(LIST X1 X2 X3 X4 X5))

The symbols naming the variables declared by the LET are interned
into the same package as VAR. All the variables are initialized
to NIL by LET."
(let ((name (symbol-name var)))
`(let ,(loop for i from 1 to n
collecting (intern (concatenate 'string name (write-to-string i))
(symbol-package var)))
,@body)))

然后,我们可以这样使用它:

(with-indexed-vars (n 4)
(setq n3 "three")
(setq n4 4)
(list n4 n1 n3 n2))

;=> (4 NIL "three" NIL)

正如 Sean Allred 在评论中指出的那样,这是 Lisp 编程入门的高级主题。如果您知道需要 n 个值单元格,您不妨使用向量和 aref 来访问这些值:

(let ((ns (make-array 4 :initial-element nil)))
(setf (aref ns 2) "three")
(setf (aref ns 3) 4)
ns)

;=> #(NIL NIL "three" 4)

关于LISP 将变量名与字符串连接起来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30174480/

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