Википедия
Термин S-выражение или sexp относится к соглашению о способе записи в доступной для человеческого понимания текстовой форме. Символические выражения создаются, в основном, из символов и списков. S-выражения наиболее известны благодаря их использованию в языках программирования семейства Лисп . Также S-выражения применяют в языках-наследниках Лиспа, таких как DSSSL , и в разметке коммуникационных протоколов вроде IMAP и CBCL Джона Маккарти . Детали синтаксиса и поддерживаемых типов данных отличаются в различных языках, но общая особенность — использование S-выражений как префиксной нотации с использованием скобок (известных как кембриджская польская нотация ) .
S-выражения используются в Лиспе как для кода, так и для данных . S-выражения были первоначально предназначены только для представления данных, которыми должны были манипулировать M-выражения , но первая реализация Лиспа была интерпретатором S-выражений, в которые планировалось переводить М-выражения, и программисты Lisp вскоре привыкли к использованию S-выражений как для данных, так и для кода.
S-выражения могут быть как отдельными объектами , такими как числа, , включая специальные символы nil и t, или , в виде (x . y). Более длинные списки, состоящие из вложенных точечных пар, например (1 . (2 . (3 . nil))), можно написать более привычным способом, как (1 2 3). Вложенные списки также могут быть записаны в виде S-выражений: . S-выражения не зависят от пробелов и разрывов строк, пробелы используются только в качестве разграничителей между атомами.
Пример: простая грамматика в виде S-выражения:
(((S) (NP) (VP)) ((VP) (V)) ((VP) (V) (NP)) ((V) died) ((V) employed) ((NP) nurses) ((NP) patients) ((NP) Medicenter) ((NP) Dr Chan))Программный код также может быть записан в виде S-выражения . Небольшой кусочек синтаксического сахара для написания программ на Лиспе заключается в том, что часто используемое выражение (quote x) может заменить сокращением "x
Пример на Common Lisp :
(defun factorial (x) (if (zerop x) 1 (* x (factorial (- x 1)))))Пример на Scheme :
(define (factorial x) (if (zero? x) 1 (* x (factorial (- x 1)))))S-выражения в Лиспе читаются с помощью функции READ. Эта функция читает текстовое представление S-выражения и возвращает Lisp-данные. Функция PRINT может быть использована для вывода S-выражения. То, что возвращает PRINT, можно прочитать с помощью функции READ при условии, что все выводимые объекты данных имеют представление для ввода-вывода. Lisp имеет такое представление для чисел, строк, символов, списков и ещё многих типов данных. Программный код может быть представлен в виде аккуратно форматированного (pretty printed) S-выражения с помощью функции PPRINT.
Lisp программы — это корректные S-выражения, но не все S-выражения являются правильными программами на Lisp. (1.0 + 3.1) — это корректное S-выражение, но не корректная Lisp-программа, Lisp использует префиксную нотацию, поэтому число с плавающей точкой (1.0) не может быть распознано как операция .