如何在Lisp宏中修复“ X不是数字”

问题描述 投票:0回答:1

我开始学习lisps,目前正在为学校制作Macros。我在名为decrement.txt]的txt文件中创建了一个名为“-=”的简单宏。

(defmacro -= (numericValue decrementValue)
   (list 'setf numericValue (- numericValue decrementValue))
)

因此,传递的参数是numericValue(将减少的值)和decrementValue(将减少numericValue的量)]

当我在CLISP中运行代码时(这是GNU CLISP 2.49),我像下面这样运行它...

[1]> (load "decrement.txt" :echo T :print T)

;; Loading file pECLisp.txt ...
(defmacro -= (numericValue decrementValue)
    (list `setf numericValue (- numericValue decrementValue))
)
-=


;;
;; Loaded file pECLisp.txt
T
[2]> (setf x 5 y 10)
10
[3]> (-= x 1)
*** - -: X is not a number
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead.
ABORT          :R2      Abort debug loop
ABORT          :R3      Abort debug loop
ABORT          :R4      Abort main loop

“ X不是数字”的含义是什么,这与宏不知道变量的实际值有关吗?因为当我键入USE-VALUE并输入5(X应该是哪个值)时,它运行得非常好,即使当我(print x)将x表示为4时,因为它在函数中递减了。因此该值会发生应有的变化,但是当我最初运行该“-=”函数时,它给出了该错误,我该如何解决?

我开始学习lisps,目前正在为学校制作Macros。我在名为decrement.txt的txt文件中创建了一个名为“-=”的简单宏(defmacro-=(numericValue decrementValue)(list'...

clisp lisp-macros
1个回答
0
投票

辛苦了,您只在宏中缺少对参数的评估。如果使用`(斜引号),则可以写为:]

(defmacro -= (numericValue decrementValue)
   `(setf ,numericValue (- ,numericValue ,decrementValue))
)
© www.soinside.com 2019 - 2024. All rights reserved.