S-вираз (sexp для символічного виразу) — спосіб запису напівструктурованих даних в доступній для людського розуміння текстовій формі. Символічні вирази створюються, в основному, із символів і списків. S-вирази найбільш відомі завдяки їх використанню в мовах програмування сімейства Lisp. Також S-вирази застосовують у мовах-спадкоємцях Ліспа, таких як DSSSL, і в розмітці комунікаційних протоколів на кшталт IMAP і CBCL Джона Маккарті.
Деталі синтаксису і підтримуваних типів даних відрізняються в різних мовах, але загальна особливість — використання S-виразів як префіксної нотації з використанням дужок (відомих як кембріджська польська нотація).
S-вирази в Ліспі як для коду, так і для даних (див. ). S-вирази були спочатку призначені тільки для представлення даних, якими повинні були маніпулювати M-вирази, але перша реалізація Ліспа була інтерпретатором S-виразів, в які планувалося перекладати М-вирази, і програмісти Lisp незабаром звикли до використання S-виразів як для даних, так і для коду.
S-вирази можуть бути як окремими об'єктами (атомами), такими як числа, [en], включаючи спеціальні символи 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) не може бути розпізнано як операція (перший елемент виразу).
Стандартизація
В травні 1997 року, Рональд Рівест запропонував Інтернет-проект ([en]) нового RFC. Проект визначив синтаксис заснований на S-виразах Ліспа, але призначений для зберігання даних загального призначення та обміну ними за аналогією з XML, а не для програмування. Він так і не був затверджений як RFC, але з тих пір цитується і використовується іншими документами RFC (наприклад RFC 2693) і в ряді інших видань. Спочатку він був призначений для використання в SPKI.
Формат Рівеста визначає S-вираз як якийсь октет-рядок (серію байт) або кінцевий список інших S-виразів. Він описує три формата обміну для виразів з цією структурою. Один з них, «advanced transport» (розширене транспортне подання), дуже гнучкий в плані форматування, і синтаксично схожий на вирази Lisp-стилю, але не є ідентичним. Розширене транспортне представлення, наприклад, дозволяє октет-рядками бути представленими дослівно (довжина рядка, потім двокрапка і весь рядок «як є»), що дозволяє уникнути символів шістнадцяткового або base64 представлення, октет-рядок може бути розміщений безпосередньо як «лексема», якщо він відповідає певним умовам. Лексеми Рівеста відрізняються від лексем в Lisp тим, що існують лише для зручності та естетики, і трактуються так само, як і інші рядки, а не мають конкретного синтаксичного сенсу. Інший формат обміну даними, призначений бути більш компактним, і простіше аналізованим, а також унікальний для будь-якого абстрактного S-виразу — це «канонічне представлення», яке допускає тільки дослівні рядки і забороняє використання пробілів як елементів форматування поза рядками. Нарешті, є ще «базове транспортне представлення» (basic transport representation), яке є канонічною формою, або ті ж елементи в кодуванні Base64, оточені дужками, причому останній слугує безпечним транспортом для канонічно-закодованих S-виразів в системі, яка дозволяє змінювати пробільні проміжки (наприклад, поштова система, яка має рядки 80-рядкової ширини, що накладаються на щось більш довге).
Цей формат не був широко прийнятий до використання за межами SPKI. Рівест на своїй вебсторінці S-виразів [ 21 серпня 2008 у Wayback Machine.] надає початковий код на Сі синтаксичного аналізатора та генератора, які, теоретично, можуть бути використані в інших програмах, хоча ліцензування цих програм не ясно. Проте, немає ніяких обмежень на незалежні реалізації роботи з цим форматом. Вільну реалізацію можна знайти за адресами sexpr.sf.net [ 14 січня 2009 у Wayback Machine.] і leon.bottou.org/projects/minilisp [ 25 лютого 2012 у Wayback Machine.].
Див. також
- [en]
- cons
Примітки
- Gazdar / MelisH, Natural Language Processing in Lisp
- . Архів оригіналу за 1 грудня 2008. Процитовано 6 грудня 2016.
{{}}
: Обслуговування CS1: Сторінки з текстом «archived copy» як значення параметру title () - . Архів оригіналу за 30 серпня 2013. Процитовано 6 грудня 2016.
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
S viraz sexp dlya simvolichnogo virazu sposib zapisu napivstrukturovanih danih v dostupnij dlya lyudskogo rozuminnya tekstovij formi Simvolichni virazi stvoryuyutsya v osnovnomu iz simvoliv i spiskiv S virazi najbilsh vidomi zavdyaki yih vikoristannyu v movah programuvannya simejstva Lisp Takozh S virazi zastosovuyut u movah spadkoyemcyah Lispa takih yak DSSSL i v rozmitci komunikacijnih protokoliv na kshtalt IMAP i CBCL Dzhona Makkarti Detali sintaksisu i pidtrimuvanih tipiv danih vidriznyayutsya v riznih movah ale zagalna osoblivist vikoristannya S viraziv yak prefiksnoyi notaciyi z vikoristannyam duzhok vidomih yak kembridzhska polska notaciya S virazi v Lispi yak dlya kodu tak i dlya danih div S virazi buli spochatku priznacheni tilki dlya predstavlennya danih yakimi povinni buli manipulyuvati M virazi ale persha realizaciya Lispa bula interpretatorom S viraziv v yaki planuvalosya perekladati M virazi i programisti Lisp nezabarom zvikli do vikoristannya S viraziv yak dlya danih tak i dlya kodu S virazi mozhut buti yak okremimi ob yektami atomami takimi yak chisla en vklyuchayuchi specialni simvoli nil i t abo tochkovimi parami u viglyadi x y Dovshi spiski sho skladayutsya z vkladenih tochkovih par napriklad 1 2 3 nil mozhna napisati bilsh zvichnim sposobom yak 1 2 3 Vkladeni spiski takozh mozhut buti zapisani u viglyadi S viraziv moloko sik med marmelad S virazi ne zalezhat vid propuskiv ta rozriviv ryadkiv propuski vikoristovuyutsya tilki yak rozmezhuvachi mizh atomami Priklad prosta gramatika u viglyadi S virazu S NP VP VP V VP V NP V died V employed NP nurses NP patients NP Medicenter NP Dr Chan Programnij kod mozhe buti zapisanij u viglyadi S virazu zazvichaj iz vikoristannyam prefiksnoj notaciyi Nevelikij shmatochok sintaksichnogo cukru dlya napisannya program na Lispi polyagaye v tomu sho chasto vikoristovuvanij viraz quote x mozhna zaminiti skorochennyam x Priklad na Common Lisp defun factorial x if zerop x 1 x factorial x 1 Priklad na Scheme define factorial x if zero x 1 x factorial x 1 S virazi v Lispi chitayutsya za dopomogoyu funkciyi READ Cya funkciya chitaye tekstove predstavlennya S virazu i povertaye Lisp dani Funkciya PRINT mozhe buti vikoristana dlya vivedennya S virazu Te sho povertaye PRINT mozhna prochitati za dopomogoyu funkciyi READ za umovi sho vsi vivedeni ob yekti danih mayut predstavlennya dlya vvodu vivodu Lisp maye take predstavlennya chisel ryadkiv simvoliv spiskiv i she bagatoh tipiv danih Programnij kod mozhe buti predstavlenij u viglyadi akuratno formatovanogo pretty printed S virazu za dopomogoyu funkciyi PPRINT Lisp programi ce korektni S virazi ale ne vsi S virazi ye pravilnimi programami na Lisp 1 0 3 1 ce korektnij S viraz ale ne korektna Lisp programa Lisp vikoristovuye prefiksnu notaciyu tomu chislo z ruhomoyu komoyu 1 0 ne mozhe buti rozpiznano yak operaciya pershij element virazu StandartizaciyaV travni 1997 roku Ronald Rivest zaproponuvav Internet proekt en novogo RFC Proekt viznachiv sintaksis zasnovanij na S virazah Lispa ale priznachenij dlya zberigannya danih zagalnogo priznachennya ta obminu nimi za analogiyeyu z XML a ne dlya programuvannya Vin tak i ne buv zatverdzhenij yak RFC ale z tih pir cituyetsya i vikoristovuyetsya inshimi dokumentami RFC napriklad RFC 2693 i v ryadi inshih vidan Spochatku vin buv priznachenij dlya vikoristannya v SPKI Format Rivesta viznachaye S viraz yak yakijs oktet ryadok seriyu bajt abo kincevij spisok inshih S viraziv Vin opisuye tri formata obminu dlya viraziv z ciyeyu strukturoyu Odin z nih advanced transport rozshirene transportne podannya duzhe gnuchkij v plani formatuvannya i sintaksichno shozhij na virazi Lisp stilyu ale ne ye identichnim Rozshirene transportne predstavlennya napriklad dozvolyaye oktet ryadkami buti predstavlenimi doslivno dovzhina ryadka potim dvokrapka i ves ryadok yak ye sho dozvolyaye uniknuti simvoliv shistnadcyatkovogo abo base64 predstavlennya oktet ryadok mozhe buti rozmishenij bezposeredno yak leksema yaksho vin vidpovidaye pevnim umovam Leksemi Rivesta vidriznyayutsya vid leksem v Lisp tim sho isnuyut lishe dlya zruchnosti ta estetiki i traktuyutsya tak samo yak i inshi ryadki a ne mayut konkretnogo sintaksichnogo sensu Inshij format obminu danimi priznachenij buti bilsh kompaktnim i prostishe analizovanim a takozh unikalnij dlya bud yakogo abstraktnogo S virazu ce kanonichne predstavlennya yake dopuskaye tilki doslivni ryadki i zaboronyaye vikoristannya probiliv yak elementiv formatuvannya poza ryadkami Nareshti ye she bazove transportne predstavlennya basic transport representation yake ye kanonichnoyu formoyu abo ti zh elementi v koduvanni Base64 otocheni duzhkami prichomu ostannij sluguye bezpechnim transportom dlya kanonichno zakodovanih S viraziv v sistemi yaka dozvolyaye zminyuvati probilni promizhki napriklad poshtova sistema yaka maye ryadki 80 ryadkovoyi shirini sho nakladayutsya na shos bilsh dovge Cej format ne buv shiroko prijnyatij do vikoristannya za mezhami SPKI Rivest na svoyij vebstorinci S viraziv 21 serpnya 2008 u Wayback Machine nadaye pochatkovij kod na Si sintaksichnogo analizatora ta generatora yaki teoretichno mozhut buti vikoristani v inshih programah hocha licenzuvannya cih program ne yasno Prote nemaye niyakih obmezhen na nezalezhni realizaciyi roboti z cim formatom Vilnu realizaciyu mozhna znajti za adresami sexpr sf net 14 sichnya 2009 u Wayback Machine i leon bottou org projects minilisp 25 lyutogo 2012 u Wayback Machine Div takozh en consPrimitkiGazdar MelisH Natural Language Processing in Lisp Arhiv originalu za 1 grudnya 2008 Procitovano 6 grudnya 2016 a href wiki D0 A8 D0 B0 D0 B1 D0 BB D0 BE D0 BD Cite web title Shablon Cite web cite web a Obslugovuvannya CS1 Storinki z tekstom archived copy yak znachennya parametru title posilannya Arhiv originalu za 30 serpnya 2013 Procitovano 6 grudnya 2016