Автор | Сообщение |
Kergan
300 сообщений |
#5710 2012-02-05 12:53 GMT+3 часа(ов) |
>В CL и в Racket - являются первоклассными.
(syntax-local-value #'and), например Цитата А в хаскеле и нету первоклассных спецформ и макросов, там только функции первоклассные. Компилировать нельзя потому что при вызове (f x) ты в f должен отправить сам символ 'x, а не его значение. И когда оно дальше будет eval (и будет ли) - неизвестно и при компиляции невыводимо.То есть ты должен делать expand и compile во время исполнения. И "макросы" все у тебя тоже во время выполнения раскрываются - причем каждый раз при вызове, а не единожды. То есть это не макросы. В таком языке, условно говоря, у нас вообще нету макросов - только функции и спецформы (непервоклассные офк) |
|
joba
157 сообщений |
#5711 2012-02-05 13:10 GMT+3 часа(ов) |
>(syntax-local-value #'and), например
Это не первоклассность. >>>>Корректный and можно легко реализовать как функцию, если использовать стратегию call-by-need(или name). >>>Такие вещи в любом лиспе очень легко реализуются, но возникают определенные проблемы - во-первых, компилировать подобный ЯП по очевидным причинам нельзя. >>Дальше не читал. Хаскелл же ведь компилируется. >А в хаскеле и нету первоклассных спецформ и макросов, там только функции первоклассные. ??? |
|
joba
157 сообщений |
#5712 2012-02-05 13:23 GMT+3 часа(ов) |
>"макросы" все у тебя тоже во время выполнения раскрываются - причем каждый раз при вызове, а не единожды.
Там где можно будут раскрываться единожды, там где нельзя - нет. >То есть это не макросы. Нудык да, это не макросы. >В таком языке, условно говоря, у нас вообще нету макросов - только функции и спецформы (непервоклассные офк) Не, спецформы первоклассные. |
|
misha![]()
1275 сообщений |
#5713 2012-02-05 19:00 GMT+3 часа(ов) |
ЦитатаТы можешь выложить где тебе угодно. ЦитатаЭто будет транслироваться в s-exprs. Затем обрабатываться уже будут s-exprs. ЦитатаOMG... Стандарт нужно читать! Ты функции foo передал символ and. (X false (/ 1 0)) => (funcall X false (/ 1 0)) ЦитатаУ Shen окружение довольно легко реализовать, т.к. почти все содержится в переменных (6-) (value *macros*) Цитата Ты о чем? Я понимаю строки, но как ты списки будешь парсить? ЦитатаКакое может быть частичное применение у макроса? Цитата Конечно, со скобками. (0-) (define trans-rulesА теперь лучше? |
|
misha![]()
1275 сообщений |
#5714 2012-02-05 19:14 GMT+3 часа(ов) |
ЦитатаОн строки не преобразовывает, просто обрабатывает их как списки. Да и как ты определишь, что этот список строка? Будешь каждый раз делать предпросмотр? ЦитатаПервоклассность заключается в том, что все макросы на самом деле являются функциями. |
|
Kergan
300 сообщений |
#5715 2012-02-05 19:46 GMT+3 часа(ов) |
Цитата А что это? И если это не первоклассность - то что тогда первоклассность? Цитата Речь, по-моему, шла о первоклассных макросах/спецформах, а не первоклассных функциях. ЯП с первоклассными макросами/спецформами в том смысле, в котором хочешь ты - сделать компилируемым нельзя и я уже объяснил почему. В хаскеле первоклассных макросов нет - потому что макросов нет. Спецформы есть - но, опять же, не первоклассные. А and там - обычная ф-я. То есть, если коротко: обычные ф-и (то есть такие, которые принимают значения, а не формы) могут быть первоклассными, макро-функции (которые принимают формы, а не значения) первоклассными быть не могут. |
|
Kergan
300 сообщений |
#5716 2012-02-05 19:50 GMT+3 часа(ов) |
Цитата Так ведь нигде нельзя. Можешь сам написать что-нибудь на kernel-подобном ЯП и убедиться - макрос всегда будет обязан раскрываться при каждом вызове. Цитата Ну а отсутствие макросов (и невозможность их реализации) ограничивает выразительность языка. Цитата Можно передать аргументом спецформу $vau? |
|
Kergan
300 сообщений |
#5717 2012-02-05 19:50 GMT+3 часа(ов) |
Цитата Значительно. Теперь можно писать макросы, которые парсят def-формы, либо в них раскрываются. |
|
Kergan
300 сообщений |
#5718 2012-02-05 19:51 GMT+3 часа(ов) |
Цитата Ну в хаскеле типизация статическая, с этим проблем нет. Цитата В лиспе все макросы на самом деле являются функциями. |
|
misha![]()
1275 сообщений |
#5720 2012-02-05 23:31 GMT+3 часа(ов) |
ЦитатаНу, так ее только парсить просто. А у меня лично от обилия скобок в глазах рябит ![]() ЦитатаЯ говорил не о хаскеле, там только типизированные proper lists, т.е. список может содержать элементы только одного типа. А joba вроде как лисп пишет, хотя я в этом уже не уверен, поэтому я и спрашиваю как он будет это дело разруливать, тем более без статической типизации. ЦитатаА иначе это уже не лисп. |
|
joba
157 сообщений |
#5722 2012-02-06 03:08 GMT+3 часа(ов) |
>Ты можешь выложить где тебе угодно.
Я в том смысле, что не факт, что ты увидишь результат. >Это будет транслироваться в s-exprs. Затем обрабатываться уже будут s-exprs. Не, это конечно можно. Но мы же говорили про Shen, в котором квадратные и фигурные скобки прописаны в стандарте и от них уже никак не избавишься. >OMG... Стандарт нужно читать! Ты функции foo передал символ and. (X false (/ 1 0)) => (funcall X false (/ 1 0)) Я читал http://www.shenlanguage.org/learn-shen/functions/functions_defining.html И что тебе не нравится? Для функции же работает такая хрень: (3-) (define foo X -> (X 3 6))А если со спецформами (and и т.д.) нельзя такого делать, то они тогда значит не первоклассные. >У Shen окружение довольно легко реализовать, т.к. почти все содержится в переменных Мы говорили не об этом. Мы говорили о том, что в их eval нельзя передать окружение. >Какое может быть частичное применение у макроса? У спецформы может быть, легко. Но спецформы для этого должны быть первоклассными, как в kernel. |
|
joba
157 сообщений |
#5723 2012-02-06 03:12 GMT+3 часа(ов) |
>Первоклассность заключается в том, что все макросы на самом деле являются функциями.
Нет. При стратегии call-by-value ты никак не сделаешь, например, and или if функциями. |
|
joba
157 сообщений |
#5724 2012-02-06 03:24 GMT+3 часа(ов) |
>А что это? И если это не первоклассность - то что тогда первоклассность?
В частности, объект первого класса должен иметь возможность передаваться в функции как параметр. В сишке, например, функции не первоклассные, не смотря на то, что можно создать указатель на функцию. >Можно передать аргументом спецформу $vau? Kernel is a conservative, Scheme-like dialect of Lisp in which everything is a first-class object. |
|
Kergan
300 сообщений |
#5725 2012-02-06 11:43 GMT+3 часа(ов) |
Цитата Да. Любой макрос в лиспе - функция, которая принимает некоторую форму и возвращает форму. Со стратегией вычисления это не связано никак. Цитата Прекрасно, в CL и в Racket макросы можно передавать как параметры. Следовательно, макросы - первоклассны. Цитата Вообще суть в чем - кернел ничем не отличается от обычного лиспа с точки зрения выразительности. Просто если в лиспе есть отдельные функции типа expand/compile, которые соответствуют стадиям исполнения формы, в кернеле этих стадий нет - они введены явно внутрь вычисления каждой формы. Из-за чего возникает очень много неудобств - начиная невозможностью компиляции и отсутствием partial-expand (например, в таком ЯП нельзя реализовать аналогичные Racket internal-definition, а если и можно - реализация будет в десятки раз длиннее), заканчивая низкой производительностью и отсутствием макросов. В чем смысл такой первоклассности - которая не содержит никаких плюсов, но содержит кучу минусов, не ясно. |
|
misha![]()
1275 сообщений |
#5732 2012-02-07 01:05 GMT+3 часа(ов) |
ЦитатаТогда не говори, что ты реализуешь лучше. Говори, что попытаешься реализовать лучше. ЦитатаНу, он же позиционируется автором как учебный язык. Т.е. игрушка для школьника. ЦитатаТы же знаешь как работает funcall, поэтому я не буду тебе объяснять, почему так происходит. Замечу только, что and, походу, особым образом обрабатывается на стадии компиляции. Не знаю зачем так усложнять себе жизнь ![]() А вообще, как ты себе это представляешь, т.е. по-твоему функция должна была автоматически перекомпилировать выражение (X false (/ 1 0))? Ну так дык, записал бы (define foo X -> (eval [X false [/ 1 0]])) ЦитатаТак и говори, что у тебя нет макросов, а есть спецформы. Т.е. ты реализовываешь не лисп, а что-то другое (со скобками как у лиспа). Но тогда зачем вообще нужны эти спецформы, когда можно обойтись функциями? отредактировал(а) misha: 2012-02-07 01:37 GMT+3 часа(ов) |
|
joba
157 сообщений |
#5735 2012-02-08 18:35 GMT+3 часа(ов) |
>Тогда не говори, что ты реализуешь лучше. Говори, что попытаешься реализовать лучше.
Нет, я реализую лучше, например, у меня в паттернах будут allowed не только конструкторы. Но ты, возможно, не сможешь увидеть мою реализацию (это не значит, что вероятность того, что я это все таки реализую, уменьшается, это значит лишь то, что вероятность того, что ты увидишь мою реализацию не очень-то велика). >Ну, он же позиционируется автором как учебный язык. Т.е. игрушка для школьника. Не, ну ты так говорил раньше, что будто бы мой диалект никому ненужен (кроме возможно меня), потому что есть Shen. >Ты же знаешь как работает funcall, поэтому я не буду тебе объяснять, почему так происходит. Замечу только, что and, походу, особым образом обрабатывается на стадии компиляции. Не знаю зачем так усложнять себе жизнь Я лишь хотел сказать, что макросы в Shen не являются первоклассными объектами. >Но тогда зачем вообще нужны эти спецформы, когда можно обойтись функциями? Нельзя. Лямбду (спецформа lambda), например, ты никак не представишь в виде функции, какую бы ты стратегию не использовал, будь то call-by-need(name,value). |
|
misha![]()
1275 сообщений |
#5736 2012-02-08 22:16 GMT+3 часа(ов) |
ЦитатаА какова причина? misha ЦитатаЕсли программа не нужна ее автору, то, возможно, она никому не нужна. Т.е. прежде чем приступать к работе нужно все заранее взвесить. Кстати, Shen был всего лишь примером языка, на базе которого ты можешь реализовать свой, или хотя бы доработать сам Shen. Т.к. существует реализация Shen на самом себе, я подумал, что тебе будет проще продумать дизайн собственного языка. ЦитатаВообще-то там они первоклассные. ЦитатаЯ не говорил о полном отказе. Они пускай будут, но их количество должно быть минимально возможным. Поэтому я бы запретил их создание пользователем. |
|