我假设传递给 Lisp 函数的值被分配给与参数名称匹配的引号。然而,令我惊讶的是:
(defun test (x) (print (eval 'x)))
(test 5)
不起作用(变量 x 未绑定)。因此,如果参数在函数中不存储为符号,那么本例中的 x 到底是什么?有没有办法从与参数名称匹配的符号访问参数?
更多背景:
我想做的是这样的:
defun slice (r1 c1 r2 c2 board)
(dolist (param '(r1 c1 r2 c2)) ;adjust for negative indices
(if (< (eval param) 0)
(set param (+ (length board) (eval param)))))
;Body of function
基本上,我想迭代前四个参数,并在它们的任何值
这基本上就是词法绑定的工作原理:变量名称在词法范围内被替换为对变量值存储位置的直接引用。绑定变量名symbol-value
仅适用于您可以声明的动态变量special
.
避免重复的一种方法是使用宏:
(defmacro with-adjusting ((&rest vars) adjust-value &body body)
`(let ,(loop for var in vars
collect `(,var (if (minusp ,var)
(+ ,var ,adjust-value)
,var)))
,@body))
(defun slice (r1 c1 r2 c2 board)
(with-adjusting (r1 c1 r2 c2) (length board)
;; function body
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)