joe*_*_04 2 lisp elisp parameter-passing
来自C++背景,我试图弄清楚如何将参数传递给Elisp中的方法.虽然我承认也许措辞可能有所不同,但我想知道它是否更接近C++通过引用传递或通过值传递的想法?如果我改变方法本身的参数,它会改变函数调用中传入的参数吗?
所有Lisps(Emacs Lisp,Common Lisp)按值传递参数,总是:
(defparameter x 42) ; defconst in Emacs Lisp
(defun test (x)
(setq x 10))
(test x)
==> 10
x
==> 42
Run Code Online (Sandbox Code Playgroud)
但请注意,某些值实际上是指针(或者更确切地说,是包含组件的对象),因此函数可以通过副作用修改其内容:
(defparameter x (list 1 2))
(defun test (x)
(setf (first x) 42
(second x) 24
x 17))
(test x)
==> 17
x
==> (42 24)
Run Code Online (Sandbox Code Playgroud)
PS1.参看 什么时候在Lisp中使用'(或引用)? - "引用的参数"也被评估:评估剥离引用.
PS2.参看 add-to-list
- 它接受一个符号(变量名)并修改其值.这仅适用于全局动态变量,不适用于词法变量.不是一个好主意.