Я хочу сохранить функцию как print
в переменной, так что я могу просто напечатать что-то короткое, как p
, например:
В Scheme
:Как хранить функцию в переменной в Лиспе и использовать его
(define print display)
(print "Hello world\n")
;; alternate way
(define print 'display)
((eval print) "Hello world\n")
Тот же подход, кажется, не работает в Common Lisp
:
(defvar p 'print)
;;(print (type-of p))
(p "Hello world") ;; Attempt 1
((eval p) "Hello world") ;; >> Attempt 2
((eval (environment) p) "Hello world") ;; Attempt 3
я получаю эту ошибку с Attempt 1
выше:
*** - EVAL: undefined function P
И это с Attempt 2
и 3
в Clisp
:
*** - EVAL: (EVAL (ENVIRONMENT) P) is not a function name; try using a
symbol instead
*** - EVAL: (EVAL P) is not a function name; try using a symbol instead
И gcl
:
Error: (EVAL P) is invalid as a function.
Error: (EVAL (ENVIRONMENT) P) is invalid as a function.
Итак:
- Что
try using a symbol
значит?p
- это, безусловно,symbol
; ложно положительный? - Что случилось с
eval
? Не соответствует ли оценкаp
процедуреprint
? - Я думал,
Lisp
процедуры былиfirst class objects
. ПочемуAttempt 1
не работает, как вScheme
?
EDIT
(Перенести из комментариев ниже)
мне было интересно, почему (setf (symbol-function 'p) #'print)
не будет работать таким образом
(setf (symbol-function 'p) 'print)
. Я получаю следующее сообщение (не очень полезно) сообщение об ошибке:
*** - SYSTEM::%PUTD: PRINT is not a function ;; CLisp
Error: PRINT is not of type LIST. ;; Gcl
Я знаю, что острый знак (#
) предполагается неоднозначность между функцией и переменной
с тем же именем, но в этом случае есть только один print
, функция.
Кроме того, почему не будет работать с defvar
вместо setf
вот так:
(defvar (symbol-function 'p) #'print)
еще defvar
и setf
как присвоить значения переменной.
Соответствующая ошибка:
*** - DEFVAR: non-symbol (SYMBOL-FUNCTION 'P) cannot be a variable ;; Clisp
Error: (SYMBOL-FUNCTION (QUOTE P)) is not of type SYMBOL. ;; Gcl
Возможный дубликат [Почему нам нужна функция funcall in lisp] (http://stackoverflow.com/questions/9729549/why-do-we-need-funcall-in-lisp) –