Напишите (список 'test and) в Racket, выдает ошибку - PullRequest
0 голосов
/ 24 мая 2018

Как гласит заголовок, этот список выдает ошибку

and: bad syntax in: and

но как записать его тогда, нужно и в этом списке?

Лучший

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Вы не можете использовать 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 /'.

0 голосов
/ 24 мая 2018

Когда вы создаете списки, вам нужно заключить каждый элемент в кавычки.

Welcome to Racket v6.12.
> (list 'test 'and)
'(test and)
...