Маленький предатель "S-выражение"
Is it true that this is an S-expression?
xyz
спрашивает Маленький интриган. а как проверить?
синтаксически я получаю, как проверить другие утверждения, такие как
> (atom? 'turkey)
а также
> (list? '(atom))
не совсем уверен, как это проверить...
> (list? '(atom turkey) or)
как это только возвращается...
or: bad syntax in: or
но в любом случае, умение проверять S-выражения меня обманывают
так что, как обычно, любое освещение ценится
2 ответа
"S-выражение" построено из атомов через несколько (возможно, ноль) cons
Приложения:
(define (sexp? expr)
(or
; several cases:
(atom? expr)
; or
(and (pair? expr) ; a pair is built by a cons
(sexp? (car expr)) ; from a "car"
(sexp? .........)) ; and a "cdr"
)))
Это практически на английском языке. Больше нечего сказать по этому поводу (я имею в виду в коде). За исключением того, после определения пропавшего
(define (atom? x)
(not (pair? x)))
Мы видим, что (sexp? ...)
могу только вернуть #t
, В этом весь смысл: в Лиспе все является S-выражением - либо атомом, либо парой S-выражений.
Предыдущий ответ правильный - Scheme (и Lisp) - это языки, основанные на S-выражениях. И предоставленный код - отличное начало.
Но не совсем правильно, что в этих языках все является S-выражением. В этом случае у вас есть выражение, которое не является синтаксически правильным, поэтому язык задыхается, когда пытается его прочитать. Другими словами, это не S-выражение.
Я знаю, что это расстраивает, и, честно говоря, не так уж и велик ответ, но это отличный урок в одном из золотых правил компьютерного программирования: Garbage In, Garbage Out. Жир в том, что вы будете получать ошибки такого рода просто потому, что при запуске программирования не представляется возможным протестировать все возможные пути, что что-то не является S-выражением, без использования самого языка.