Вы не можете использовать and
, кроме как в начале s-expr, потому что это зарезервированное слово, кажется.
Так что вне этого в других позициях, вы можете использовать его только с quote
, иначе это дает неправильную синтаксическую ошибку.
Единственная возможность позволить ему появиться в конце списка - таким образом - это:
`(test ,'and)
;; '(test and)
Кроме того, Racket создает синтаксис-проверить (проверить, связана ли переменная или нет) перед оценкой.(И не при оценке выражения, как это делает Common Lisp).
(if '() whatever 3) ;; `whatever` being a variable not defined before.
;; common-lisp: 3
;; racket: whatever: unbound identifier in module in: whatever
В Common Lisp, поскольку это Lisp-2 (разные пространства имен между функцией и переменной), вы даже можете создать / сохранить переменнуюс именем and
:
;; CL: a variable with the name 'and'
(defvar and 3)
(list 1 and)
;; => (1 3)
Однако и в Common Lisp переопределение функции and
не допускается:
;; CL: redefine function 'and' - doesn't work:
(defun and (&rest args) (apply #'or args))
;; *** - DEFUN/DEFMACRO: AND is a special operator and may not be redefined.
В Racket невозможносвяжите sth с зарезервированным словом, таким как and
.
Итак, поскольку Racket - это Lisp-1, любое переопределение and
не допускается (ни в качестве имени переменной, ни в качестве имени функции), и, поскольку Racketвыполняет синтаксическую проверку для связанных переменных перед вычислением s-выражения - будь то специальная форма / макрос или функция - and
в любой другой позиции, кроме начала s-выражения, не может произойти в Racket без quote
/'
.