Как я могу исправить "X не число" в моем макросе в Лиспе - PullRequest
1 голос
/ 11 апреля 2020

Я начал изучать шрифты и сейчас работаю над макросами для школы. Я создал простой макрос с именем «- =» в текстовом файле с именем decment.txt

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

. Таким образом, передаются следующие параметры: numericValue (значение, которое будет уменьшено) и decmentValue (количество, на которое numericValue будет уменьшено by)

Когда я запускаю код в 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, потому что он был уменьшен в функции. Таким образом, значение изменяется, как и должно, но когда я первоначально запускаю эту функцию "- =", это дает эту ошибку, как я могу это исправить?

1 Ответ

0 голосов
/ 11 апреля 2020

Добрых усилий, вам не хватает только в макросе оценки параметров. Если вы используете `(наклонная кавычка), вы можете написать это как:

(defmacro -= (numericValue decrementValue)
   `(setf ,numericValue (- ,numericValue ,decrementValue))
)

Теперь вы можете сделать:

(-= x 1)  => 4
x  => 4
...