Предикат S-выражения Little Schemer

Is it true that this is an S-expression?
xyz

— спрашивает Маленький Интриган. а как тестировать?


синтаксически я понимаю, как проверять другие операторы, такие как

> (atom? 'turkey)

а также

> (list? '(atom))

не совсем понял как это проверить...

> (list? '(atom turkey) or)

как только возвращается...

or: bad syntax in: or

но в любом случае, знание того, как тестировать S-выражения, меня обманывает

так что, как обычно, любое освещение приветствуется


person user3435279    schedule 07.07.2014    source источник
comment
проверьте stackoverflow.com/q/18510534/849891 и остальную часть the-little-schemer. :)   -  person Will Ness    schedule 08.07.2014


Ответы (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-выражений.

person Will Ness    schedule 08.07.2014

Предыдущий ответ правильный - Scheme (и Lisp) - это языки, основанные на S-выражениях. И предоставленный код — отличное начало.

Но не совсем правильно, что все является S-выражением в этих языках. В этом случае у вас есть выражение, которое синтаксически неверно, поэтому язык задыхается, когда пытается его прочитать. Другими словами, это не S-выражение.

Я знаю, что это расстраивает, и, честно говоря, не такой уж хороший ответ, но это отличный урок одного из золотых правил компьютерного программирования: мусор на входе, мусор на выходе. Суть в том, что вы будете получать такого рода ошибки просто потому, что в начале программирования невозможно проверить всеми возможными способами, что что-то не является S-выражением без используя сам язык.

person Jeff P.    schedule 11.07.2014
comment
(list? '(atom turkey) or) тоже является S-выражением. Проблема возникает, когда REPL пытается его оценить, т. е. когда он рассматривает его как код LISP. :) Вызов (sexp? '(list? '(atom turkey) or)) должен вернуть #t. - person Will Ness; 12.07.2014