Function 在defun中设置参数变量时会发生什么?(Emacs)

Function 在defun中设置参数变量时会发生什么?(Emacs),function,emacs,parameters,elisp,Function,Emacs,Parameters,Elisp,在上面的代码中,似乎既没有出现setq a 5,也没有出现setq 0 5。如果setqa5发生了,那么a将变为5,但a仍然是0。如果发生setq 0 5,则会发生Lisp错误。发生了什么事?这是我的问题 对于你们中的一些人来说,他们通过谷歌搜索来到这里,并想知道如何让it-5如其名称所示发挥作用,其中一种方法是 (defun make-it-5 (num) (setq num 5)) (setq a 0) (make-it-5 a) ;; now a is still 0, not 5.

在上面的代码中,似乎既没有出现setq a 5,也没有出现setq 0 5。如果setqa5发生了,那么a将变为5,但a仍然是0。如果发生setq 0 5,则会发生Lisp错误。发生了什么事?这是我的问题

对于你们中的一些人来说,他们通过谷歌搜索来到这里,并想知道如何让it-5如其名称所示发挥作用,其中一种方法是

(defun make-it-5 (num)
  (setq num 5))
(setq a 0)
(make-it-5 a)
;; now a is still 0, not 5.
另一个是:

(defmacro make-it-7 (num) ; defmacro instead of defun
  `(setq ,num 7))
(setq a 0)
(make-it-7 a)
;; now a is 7.

简单的回答是setq num 5 num,它是make-it-5函数的本地绑定

接下来是细分。最好确保你熟悉这个概念

当对make-it-5a求值时,解释器在表达式的第一个元素中查找函数。在本例中,第一个元素是一个符号make-it-5,这意味着它是一个,因此它在符号的。注意:此查找可能会重复,请参阅

对表达式的其余元素求值以查找值。在本例中,只有一个符号a,因此解释器返回0

然后,解释器将该函数应用于参数列表,这涉及到生成。在这种情况下,将在符号num和值0之间进行比较。然后在该环境中评估函数体

主体只是一个单独的表达式,它是对的调用。我将调用放在引号中,因为setq是一个函数,不计算它的第一个参数,而是查找符号并设置,这是在函数make-it-5中创建的绑定


因此,您正在更改函数make-it-5的本地绑定symbol num。

简单的回答是setq num 5 num,它是make-it-5函数的本地绑定

接下来是细分。最好确保你熟悉这个概念

当对make-it-5a求值时,解释器在表达式的第一个元素中查找函数。在本例中,第一个元素是一个符号make-it-5,这意味着它是一个,因此它在符号的。注意:此查找可能会重复,请参阅

对表达式的其余元素求值以查找值。在本例中,只有一个符号a,因此解释器返回0

然后,解释器将该函数应用于参数列表,这涉及到生成。在这种情况下,将在符号num和值0之间进行比较。然后在该环境中评估函数体

主体只是一个单独的表达式,它是对的调用。我将调用放在引号中,因为setq是一个函数,不计算它的第一个参数,而是查找符号并设置,这是在函数make-it-5中创建的绑定


因此,您正在更改函数make-it-5的本地符号num的绑定。

这个问题有点让人困惑。您提供的两个备选方案都需要更详细地了解lisp emacs lisp。我猜你也不明白它们是怎么工作的……这个问题有点让人困惑。您提供的两个备选方案都需要更详细地了解lisp emacs lisp。我猜你也不明白它们是怎么工作的。。。
(defun make-it-plus (num-var)
  (set num-var (+ 1 (symbol-value num-var))) ; `set' instead of `setq'
) 
(setq a 0)
(make-it-plus 'a) ; 'a instead of a
;; now a is 1.