Czy nawiasy kwadratowe i nawiasy klamrowe w Clojure są nadal wyrażeniami typu S?

12

Próbuję nauczyć się Lisp i patrzeć na wszystkie Lispy i ich różnice.

Widzę, że w niektórych implementacjach Schematu można używać nawiasów kwadratowych zamiennie z nawiasami okrągłymi dla zapewnienia czytelności, więc ponieważ są one traktowane tak samo, zakładam, że nadal są one tylko wyrażeniami S, jak wszystko inne.

Jednak w Clojure widzę, że nawiasy kwadratowe i nawiasy klamrowe są używane do reprezentowania różnych typów danych, takich jak wektory i tak dalej. Czy są to również nadal prawidłowe wyrażenia S, czy też należy je uważać za atomy? Czy to nie „łamie” całej koncepcji wyrażeń S, przez co Clojure jest „nieczystym” Lispem?

mydoghasworms
źródło
Technicznie „jeśli nawiasy kwadratowe są wyrażeniami s, to jak możesz je wyrazić w nawiasach?” nie było częścią pytania, ale właśnie o tym chcę wiedzieć.
Qwertie

Odpowiedzi:

10

Dosłowna notacja dla wektorów i map (tj. Nawiasy kwadratowe i nawiasy klamrowe) to po prostu cukier w czasie odczytu , a wszystko, co możesz reprezentować za pomocą tej notacji, może być również reprezentowane za pomocą wyrażeń S. W rezultacie nie ma utraty mocy ani homoikoniczności, a makra czytników (które, jak rozumiem, są jeszcze potężniejsze) są dostępne w wielu seplenieniach.

Nawiasem mówiąc, zwróć uwagę, że Clojure zapewnia teraz mechanizm tworzenia niestandardowych literackich „otagowanych”, które, podobnie jak inne literały, są przekształcane w wyrażenia S przed ich kompilacją i interpretacją.

tvachon
źródło
1
Mmm, twoja odpowiedź sprawia, że ​​myślę, że rozumiem mniej niż myślałem o Lisp. Więc, co mówisz (myślę), że kwadratowe i nawiasy klamrowe w rzeczywistości nie są same w sobie wyrażeniami S. Myślałem, że cały pomysł z wkładem Lisp polega na tym, że wszystko jest wyrażeniem S. Wygląda na to, że muszę jeszcze trochę kopać, zanim wrócę, by przeczytać twoją odpowiedź ponownie. Dzięki!
mydoghasworms
Zgadza się - nie są to wyrażenia S. Składnia Lisp zaczyna się od wyrażeń S, tzn. Wszystko, co można wyrazić w języku, można wyrazić za pomocą wyrażeń S. Ale składnia Lisp na tym się nie kończy: wiele kompilatorów Lisp ma wyraźną fazę odczytu i makra, w której specjalne wzorce w kodzie źródłowym są przekształcane w wyrażenia S. To pozwala autorom języków zaoferować programistom przyjazną dla człowieka składnię. Ważną rzeczą do zapamiętania jest to, że ponieważ wszystko reprezentowane przez te specjalne literały może być również reprezentowane w wyrażeniach S, żadna z korzyści homoikoniczności nie jest utracona.
tvachon
3

Wyrażenia S są tekstową reprezentacją danych. Liczby, symbole, komórki przeciw, listy, ciągi, ... Common Lisp ma również reprezentacje tekstowe dla tablic, wektorów, więcej typów liczb, znaków, ... Common Lisp zapewnia również rozszerzalny czytnik, dzięki czemu użytkownik może dodać więcej reprezentacji tekstowych dla typów danych. Czasami ten mechanizm służy również do zmiany składni języka programowania Lisp (na przykład do obsługi wyrażeń lub instrukcji infix z innych języków programowania).

Tak więc, jeśli dialekt Lisp oferuje reprezentacje tekstowe dla dodatkowych typów danych, dobrze pasuje to do idei wyrażeń s.

Rainer Joswig
źródło