Автор | Сообщение |
Kergan
300 сообщений |
#5679 2012-02-04 15:34 GMT+3 часа(ов) |
Цитата Написать новый eval? Других способов нет ![]() Цитата Это не важно. Важно, что нарушается соответствие между кодом и АСТ. |
|
misha![]()
1275 сообщений |
#5680 2012-02-04 15:48 GMT+3 часа(ов) |
Цитата Shen не является классическим диалектом лиспа. Да и где оно рарушается? (0-) (defmacro unless-macro отредактировал(а) misha: 2012-02-04 16:08 GMT+3 часа(ов) |
|
Kergan
300 сообщений |
#5681 2012-02-04 16:36 GMT+3 часа(ов) |
Цитата я же указал, где: "не проставлены скобки вокруг "0 -> 1" и "N -> (* N (factorial (- N 1)))" , которые должны там быть.". Со скобками код представляет АСТ безо всяких трансформаций, без скобок - нужна трансформация, чтобы получить АСТ из кода. Цитата shen ленивый чтоли? |
|
misha![]()
1275 сообщений |
#5682 2012-02-04 16:57 GMT+3 часа(ов) |
ЦитатаТрансформация все равно нужна. АСТ - это простой список. Трансформация нужна для последующих стадий компиляции. Упрощенно экспанд можно представить как АСТ-1 --> АСТ-2 --> ... --> АСТ-N. Скобки нужны для упрощения трансформации, т.е. как синтаксический сахар. ЦитатаНет. Макросы используют сопоставление с образцом. |
|
Kergan
300 сообщений |
#5683 2012-02-04 17:08 GMT+3 часа(ов) |
Цитата Нет, всегда можно расставить скобки так, что трансформация не нужна. Цитата Скобки нужны, чтобы трансформации ообще не было - в этом случае сам код является АСТ'ом, что упрощает разбор, генерацию и вообще написание макросов. Если скобок недостаточно - нам придется проводить синтаксический разбор в уме. Цитата Я не о том. Если shen не ленивый, то из if нельзя сделать функцию, как она каррируется-то? Оно ведь не будет корректно работать. |
|
misha![]()
1275 сообщений |
#5684 2012-02-04 17:21 GMT+3 часа(ов) |
Цитата CG-USER(1): (macroexpand '(cond (T 12))) ЦитатаА его и так придется производить, если ты о чтении кода. Цитата (0-) (defmacro unless-macro |
|
Kergan
300 сообщений |
#5685 2012-02-04 18:11 GMT+3 часа(ов) |
для кода "(cond (T 12))" АСТ будет '(cond (T 12)) - никакой трансформации.
Цитата Если скобок достатончое количество - не придется. Так как в этом случае код - это и есть АСТ. Цитата ну и что будет, если я напишу (((unless) false) (display 'x))? |
|
misha![]()
1275 сообщений |
#5686 2012-02-04 18:37 GMT+3 часа(ов) |
Цитата ЦитатаЧто значит никакой? Я же привел пример. Короче, я не понимаю в чем заключается проблема? Читать код Shen непривычно? А макрос loop из CL, а (#t . if . 1 2) из рэкета, да и `(1 2 . ,(+ 1 2)) - дискомфорта не вызывает? ЦитатаНапечатает x, даже при true. (1-) (((unless) false) print + 1) |
|
Kergan
300 сообщений |
#5687 2012-02-04 18:43 GMT+3 часа(ов) |
Цитата В твоем примере код это и есть АСТ, никакой трансформации не требуется. Цитата Нет, проблема в том, что нужно в уме производить синтаксический разбор кода. Цитата обладает теми же недостатками. Именно по-этому loop и плох ![]() Цитата а точку нельзя использовать много раз. То есть (1 . + . 2 . + . 3) или `(1 2 . ,(+ 1 2) . ,(+ 3 4)) не напишешь. Цитата Н о чем и речь - некорректное поведение. Нафиг такое "недокаррирование"? |
|
misha![]()
1275 сообщений |
#5688 2012-02-04 18:56 GMT+3 часа(ов) |
Цитата Цитата ЦитатаТак мог бы просто написать, что тебе неудобно читать, а не вести разговор об АСТ. ЦитатаЗахотят, будет можно. ЦитатаА ты какое хотел? Ведь (unless) => #<lambda> |
|
Kergan
300 сообщений |
#5689 2012-02-04 19:28 GMT+3 часа(ов) |
Цитата При чем тут удобство чтения? Я говорю о вполне объективных вещах - требуется ли производить синтаксический разбор для построения АСТ или не требуется. Это оказывает кардинальное влияние на написание макросов. Цитата Ну вот когда захотят - тогда и будет об этом говорить, а пока гомоиконность синтаксиса сохраняется. Цитата Ну если нормально каррировать форму нельзя - то вообще никак не надо. Во избежание. |
|
misha![]()
1275 сообщений |
#5690 2012-02-04 19:48 GMT+3 часа(ов) |
ЦитатаСинтаксический разбор производится в специальных формах типа define. Но если не требуется паттерн матчинг, то сгодится и обычный defun (0-) (defun f (a b) [+ a b]) Цитата(#t . if . 1 2) - а это что нормальное s-выражение? ЦитатаКаррировать или нет - это твое дело. |
|
Kergan
300 сообщений |
#5691 2012-02-04 20:44 GMT+3 часа(ов) |
Цитата А если требуется - то приходится делать разбор. Цитата Да, нормальное. Ненормальные варианты я указывал. Цитата Тут проблема в том, что это не каррирование. Оно только выглядит как каррирование. |
|
misha![]()
1275 сообщений |
#5692 2012-02-04 22:07 GMT+3 часа(ов) |
ЦитатаТак не ты же его делаешь ![]() ЦитатаА тут не приходится делать синтаксический разбор? Кстати, этот синтаксис даже в r7rs не прописан. ЦитатаГлавное не зевать и все будет в порядке. |
|
Kergan
300 сообщений |
#5693 2012-02-05 00:18 GMT+3 часа(ов) |
Цитата А кто? Именно мне делать и приходится. Так как, например, чтобы распарсить форму - мне надо знать, во что эта форма раскроется. И наоборот - чтобы эту форму сгенерить, мне надо знать результат ридера. Цитата по сути нет |
|
misha![]()
1275 сообщений |
#5694 2012-02-05 00:41 GMT+3 часа(ов) |
ЦитатаДопустим, не знаешь ты синтаксиса case. Какой тебе вариант покажется нагляднее, со скобками или без? CG-USER(1): (setf (macro-function 'kernel-case) (macro-function 'case)) ЦитатаПочему нет? ![]() |
|
joba
157 сообщений |
#5695 2012-02-05 01:09 GMT+3 часа(ов) |
>Это настраиваемая в рантайме опция.
Я рад за них. Но type checking у них все равно возможен только статический. >Реализуешь лучше? Угу. >> В-третьих, синтаксис довольно далек от чистого s-expressions. >Обоснуй. Квадратные и фигурные скобки, например. >Значит производительность тебя не волнует. Волнует. Но не в первую очередь. >Разделение пространств имен - это правильный шаг. Макросы не являются первоклассными объектами. Это очень неудобно. >А зачем? Eval использует текущее пространство имен. Для реализации объекта make-module, с помощью которого можно будет создавать модули, например. Для реализации аналога vau-calculi, типа как в kernel. >> В-седьмых, есть строки как базовый тип объектов - лишняя сущность. >Обоснуй. Occam razor, например. Не нужно будет создавать специальные функции для строк, а можно будет использовать те же, что и для списков. |
|
joba
157 сообщений |
#5696 2012-02-05 01:17 GMT+3 часа(ов) |
>а примеры есть какие-нибудь? Типа "вот так можно в кернел и нельзя в других лиспах".
http://en.wikipedia.org/wiki/Kernel_%28programming_language%29#Example Но это плохой пример. Корректный and можно легко реализовать как функцию, если использовать стратегию call-by-need(или name). |
|
joba
157 сообщений |
#5698 2012-02-05 02:16 GMT+3 часа(ов) |
>shen ленивый чтоли?
Неа, просто в нем после частичного применения if превращается в нечто другое. (4-) (if true 0 (/ 1 0))Короче, полный бред. |
|
misha![]()
1275 сообщений |
#5699 2012-02-05 02:29 GMT+3 часа(ов) |
ЦитатаТакой и нужен. А вообще типов там маловато, т.е. придется создавать новые, а иначе ничего толкового на нем не напишешь. ЦитатаСмотри, буду проверять ![]() Цитата Если ты добавишь поддержку ридер-макросов, то сам сможешь реализовать что-то подобное. Цитата (0-) (defmacro unless-macro ЦитатаЭто вроде как уже кто-то реализовал. Я толком не интересовался. В конце концов я ведь только выступаю в роли адвоката ![]() ЦитатаЗато это упрощает парсинг строки (define remove-my-name отредактировал(а) misha: 2012-02-05 02:36 GMT+3 часа(ов) |
|
misha![]()
1275 сообщений |
#5700 2012-02-05 02:34 GMT+3 часа(ов) |
ЦитатаА так должно быть. Это ведь прописано в стандарте. (0-) (if)Т.е. ты вызываешь функцию, а не макрос. |
|
joba
157 сообщений |
#5701 2012-02-05 04:20 GMT+3 часа(ов) |
>Такой и нужен.
Такой есть уже в хаскелл. >Смотри, буду проверять Я не обещаю, что выложу код здесь, я сказал "возможно". >Если ты добавишь поддержку ридер-макросов, то сам сможешь реализовать что-то подобное. Проблема не в этом, реализовать-то я смогу, но это уже будут не s-exprs. >(defmacro unless-macro ... Фигня какая-то. Вот: (26-) (define foo X -> (X false (/ 1 0))) Т.е. он подставляет не and, а какую-то функцию. Феерический бред. >Это вроде как уже кто-то реализовал. Я толком не интересовался. В конце концов я ведь только выступаю в роли адвоката т.е. я не использую его для разработки. Сомневаюсь, что они реализовали что-то дельное. Но все равно это был пример. Передавать окружение еще много где нужно. >Зато это упрощает парсинг строки Ты имеешь в виду @s? Что мешает сделать @l для произвольных списков? |
|
joba
157 сообщений |
#5702 2012-02-05 04:21 GMT+3 часа(ов) |
>А так должно быть. Это ведь прописано в стандарте.
Ну тогда это уже не частичное применение. |
|
Kergan
300 сообщений |
#5703 2012-02-05 12:12 GMT+3 часа(ов) |
Цитата Конечно, со скобками. |
|
Kergan
300 сообщений |
#5704 2012-02-05 12:13 GMT+3 часа(ов) |
Цитата Но на самом-то деле нельзя - оно же жутко тормозить будет. |
|
joba
157 сообщений |
#5705 2012-02-05 12:19 GMT+3 часа(ов) |
>Но на самом-то деле нельзя - оно же жутко тормозить будет.
В хаскелл работает и норм. |
|
Kergan
300 сообщений |
#5706 2012-02-05 12:21 GMT+3 часа(ов) |
Цитата В CL и в Racket - являются первоклассными. Цитата в vau передается лексический контекст, а не неймспейс, это разные вещи же. Цитата Такие вещи в любом лиспе очень легко реализуются, но возникают определенные проблемы - во-первых, компилировать подобный ЯП по очевидным причинам нельзя. Во-вторых - макросов в подобном ЯП, по очевидным причинам, уже не будет. То есть макросы можно в некотором смысле смоделировать, но они не будут работать как полноценные макросы, т.к. нельзя написать expand. Ввести фазы и контролировать порядок исполнения тоже никак нельзя. Ну и все это будет совершенно жутчайшим образом тормозить. |
|
Kergan
300 сообщений |
#5707 2012-02-05 12:23 GMT+3 часа(ов) |
Цитата ну мне так кажется там соответствующие ф-и для строк перегружены, нет? |
|
joba
157 сообщений |
#5708 2012-02-05 12:33 GMT+3 часа(ов) |
>В CL и в Racket - являются первоклассными.
> (define (foo x) (x #f #t)) >в vau передается лексический контекст, а не неймспейс, это разные вещи же. Чо? Речь шла про eval, который в vau-calculi должен принимать окружение. >компилировать подобный ЯП по очевидным причинам нельзя. Дальше не читал. Хаскелл же ведь компилируется. |
|
joba
157 сообщений |
#5709 2012-02-05 12:35 GMT+3 часа(ов) |
>ну мне так кажется там соответствующие ф-и для строк перегружены, нет?
Х.з., может внутрях оно там как-то хитро преобразовывается это все, но это уже детали реализации ghc, насколько я понимаю. Мне кажется, что у них там довольно хитрый компилятор. |
|