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