Маленький предатель "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-выражением, без использования самого языка.

Другие вопросы по тегам