Разбира се, можете да имплементирате това, за което говорите, в Lisp.
Една голяма разлика между Lisp и другите езици е, че нищо не е фиксирано и вие контролирате какво прави читателят с всеки един знак от входния изходен код. Буквално.
Помислете например за проекта CL-Python и неговия режим Lisp/Python със смесен синтаксис.
По принцип в този режим, ако това, което въвеждате, започва с отворена скоба, тогава се счита за Lisp, в противен случай се счита за Python (включително многоредови конструкции).
...ВЪПРЕКИ ТОВА...
този вид макро/четец-макро библиотека се внедрява рядко, тъй като едно от основните предимства на подхода на s-израз е, че е добре композируем и можете да изграждате други макроси върху съществуващи макроси, повишавайки нивото на езика.
След като се изостави редовността на подхода на s-израз, писането на макроси става досадно, защото за да напишете код, който манипулира код, трябва да имате предвид няколко различни конструкции на езика, правила за приоритет, специални правила, специални синтактични форми.
Езиците, които не са базирани на s-израз, понякога осигуряват реална способност за обработка на макроси, но работят на ниво AST, т.е. след като някои анализиращи обработки вече са извършени по фиксиран начин. Освен това кодът на макроса в тези езици изглежда наистина странен, защото кодът, който макросът манипулира, проверява или изгражда, не изглежда като истински код.
Понякога на други езици вместо това можете да намерите само текстови макроси, които основно са заменени с търсене. За да видите пример за това колко грозни могат да станат нещата, разгледайте стандартната библиотека на Python изпълнение на collections.namedtuple (около ред 284) и неговия набор от абсурдни ограничения, предизвикани само поради това изпълнение.
Друг пример за това как нещата могат да станат ужасно сложни, след като се принудите да използвате подход само с шаблон, за да избегнете сложността на манипулирането на неправилен и специален език с регистър, е C++ шаблонно метапрограмиране.
Вместо това прост език, базиран на s-израз и квази-цитиране, прави макро кода много по-лесен за писане, четене и разбиране и затова кодът на Lisp не се отдалечава от него. Не защото не може, а защото няма смисъл да се преминава към по-лош синтаксис без причина.
В Lisp вие "огъвате" езика малко, като добавяте абстракциите, които наистина са необходими, без обаче да нарушавате всичко останало и най-важното, без да изпускате способността да правите повече огъване в бъдеще, ако е необходимо. Писането на макрос/макрос за четене, който прави израза да анализира кошмара на да кажем C++ и в същото време премахва възможността за писане на допълнителни макроси и добавяне на повече конструкции (или го прави невероятно трудно), би било безсмислено самоубийство.
Дори макрос като (infix x + y * z)
е просто упражнение... Съмнявам се, че някой lisper би го използвал, за да напише истински код... защо, за бога, някой ще въведе отново абсурдната двойственост функция/оператор и кошмара на правилата за приоритет/асоциативност? Ако не харесвате Lisp, просто не използвайте Lisp.
За лиспер не частта (infix
и )
е грозна... а това, което е по средата.
Освен това защо мислите, че 2+3*6 е "естествено" 20? Защото учителят те е удрял с пръчка по дланите, когато си бил дете, докато не го разбереш правилно?
person
6502
schedule
14.07.2015
eval-when
форма от най-високо ниво, която включва:compile-toplevel
и/или:load-toplevel
, което тяло променя текущия*readtable*
на такъв, който може да чете инфиксна нотация. Все още ще ви е необходим краен разделител или просто пренесете синтаксиса до EOF, тъй като иload
, иcompile-file
свързват*readtable*
около обработката на файлове. И да, DSL в Lisp са лесни, като се има предвид синтаксис s-expr (или по-скоро четим синтаксис на Lisp), но иначе изискват анализатор, както във всеки друг език. Трябва да прецените (не)предимствата и да видите дали това отговаря на вашите нужди. - person acelent   schedule 16.07.2015compile
илиcompile-file
. Спомням си, че направих това за AST на персонализиран език (стил C lex&yacc) и не само се зареди, но и толкова добре, че можех да сравня резултатите с компилирания машинен език. - person acelent   schedule 17.07.2015