Предыдущая страница [1] [2] > 3 <

Автор Сообщение

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5710   2012-02-05 12:53 GMT+3 часа(ов)      
>В CL и в Racket - являются первоклассными.

(syntax-local-value #'and), например

Цитата
Дальше не читал. Хаскелл же ведь компилируется.


А в хаскеле и нету первоклассных спецформ и макросов, там только функции первоклассные.
Компилировать нельзя потому что при вызове (f x) ты в f должен отправить сам символ 'x, а не его значение. И когда оно дальше будет eval (и будет ли) - неизвестно и при компиляции невыводимо.То есть ты должен делать expand и compile во время исполнения. И "макросы" все у тебя тоже во время выполнения раскрываются - причем каждый раз при вызове, а не единожды. То есть это не макросы.
В таком языке, условно говоря, у нас вообще нету макросов - только функции и спецформы (непервоклассные офк)

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#5711   2012-02-05 13:10 GMT+3 часа(ов)      
>(syntax-local-value #'and), например

Это не первоклассность.

>>>>Корректный and можно легко реализовать как функцию, если использовать стратегию call-by-need(или name).
>>>Такие вещи в любом лиспе очень легко реализуются, но возникают определенные проблемы - во-первых, компилировать подобный ЯП по очевидным причинам нельзя.
>>Дальше не читал. Хаскелл же ведь компилируется.
>А в хаскеле и нету первоклассных спецформ и макросов, там только функции первоклассные.

???

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#5712   2012-02-05 13:23 GMT+3 часа(ов)      
>"макросы" все у тебя тоже во время выполнения раскрываются - причем каждый раз при вызове, а не единожды.

Там где можно будут раскрываться единожды, там где нельзя - нет.

>То есть это не макросы.

Нудык да, это не макросы.

>В таком языке, условно говоря, у нас вообще нету макросов - только функции и спецформы (непервоклассные офк)

Не, спецформы первоклассные.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5713   2012-02-05 19:00 GMT+3 часа(ов)      
Цитата
Я не обещаю, что выложу код здесь, я сказал "возможно".
Ты можешь выложить где тебе угодно.
Цитата
Проблема не в этом, реализовать-то я смогу, но это уже будут не s-exprs.
Это будет транслироваться в s-exprs. Затем обрабатываться уже будут s-exprs.
Цитата
Фигня какая-то. Вот:

(26-) (define foo X -> (X false (/ 1 0)))
foo

(28-) (foo and)
/: division by zero

(29-) (and false (/ 1 0))
false

Т.е. он подставляет не and, а какую-то функцию. Феерический бред.
OMG... Стандарт нужно читать! Ты функции foo передал символ and. (X false (/ 1 0)) => (funcall X false (/ 1 0))
Цитата
Сомневаюсь, что они реализовали что-то дельное. Но все равно это был пример. Передавать окружение еще много где нужно.
У Shen окружение довольно легко реализовать, т.к. почти все содержится в переменных
(6-) (value *macros*)
[def-macro shen-timer-macro shen-cases-macro shen-abs-macro
shen-put/get-macro shen-compile-macro shen-yacc-macro
shen-datatype-macro shen-let-macro shen-assoc-macro
shen-i/o-macro shen-prolog-macro shen-synonyms-macro
shen-nl-macro shen-vector-macro shen-@s-macro
shen-defmacro-macro shen-defprolog-macro
shen-function-macro]

Цитата
Ты имеешь в виду @s? Что мешает сделать @l для произвольных списков?

Ты о чем? Я понимаю строки, но как ты списки будешь парсить?
Цитата
Ну тогда это уже не частичное применение.
Какое может быть частичное применение у макроса?
Цитата
Допустим, не знаешь ты синтаксиса case. Какой тебе вариант покажется нагляднее, со скобками или без?

Конечно, со скобками.

(0-) (define trans-rules
[] -> []
[[[A|B] C]|D] -> (append [A|B] [-> C] (trans-rules D))
[[A B]|C] -> (append [A -> B] (trans-rules C)))
trans-rules
 
(1-) (defmacro def-macro
[def Name | Rules] -> [define Name | (trans-rules Rules)])
macro
def-macro
 
(2-) (def x
(([A|B] C)
[C|[A|B]])
((A B)
(+ A B)))
x
 
(3-) (x [2 3] 1)
[1 2 3]
 
(4-) (x 1 2)
3
А теперь лучше?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5714   2012-02-05 19:14 GMT+3 часа(ов)      
Цитата
>ну мне так кажется там соответствующие ф-и для строк перегружены, нет?

Х.з., может внутрях оно там как-то хитро преобразовывается это все, но это уже детали реализации ghc, насколько я понимаю. Мне кажется, что у них там довольно хитрый компилятор.

Он строки не преобразовывает, просто обрабатывает их как списки. Да и как ты определишь, что этот список строка? Будешь каждый раз делать предпросмотр?
Цитата
>(syntax-local-value #'and), например

Это не первоклассность.
Первоклассность заключается в том, что все макросы на самом деле являются функциями.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5715   2012-02-05 19:46 GMT+3 часа(ов)      
Цитата
Это не первоклассность.


А что это? И если это не первоклассность - то что тогда первоклассность?

Цитата
???

Речь, по-моему, шла о первоклассных макросах/спецформах, а не первоклассных функциях. ЯП с первоклассными макросами/спецформами в том смысле, в котором хочешь ты - сделать компилируемым нельзя и я уже объяснил почему. В хаскеле первоклассных макросов нет - потому что макросов нет. Спецформы есть - но, опять же, не первоклассные. А and там - обычная ф-я. То есть, если коротко: обычные ф-и (то есть такие, которые принимают значения, а не формы) могут быть первоклассными, макро-функции (которые принимают формы, а не значения) первоклассными быть не могут.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5716   2012-02-05 19:50 GMT+3 часа(ов)      
Цитата
Там где можно будут раскрываться единожды, там где нельзя - нет.


Так ведь нигде нельзя. Можешь сам написать что-нибудь на kernel-подобном ЯП и убедиться - макрос всегда будет обязан раскрываться при каждом вызове.

Цитата
Нудык да, это не макросы.


Ну а отсутствие макросов (и невозможность их реализации) ограничивает выразительность языка.

Цитата
Не, спецформы первоклассные.

Можно передать аргументом спецформу $vau?

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5717   2012-02-05 19:50 GMT+3 часа(ов)      
Цитата
А теперь лучше?

Значительно. Теперь можно писать макросы, которые парсят def-формы, либо в них раскрываются.

Kergan

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5718   2012-02-05 19:51 GMT+3 часа(ов)      
Цитата
Он строки не преобразовывает, просто обрабатывает их как списки. Да и как ты определишь, что этот список строка? Будешь каждый раз делать предпросмотр?

Ну в хаскеле типизация статическая, с этим проблем нет.

Цитата
Первоклассность заключается в том, что все макросы на самом деле являются функциями.

В лиспе все макросы на самом деле являются функциями.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5720   2012-02-05 23:31 GMT+3 часа(ов)      
Цитата
Теперь можно писать макросы, которые парсят def-формы, либо в них раскрываются.
Ну, так ее только парсить просто. А у меня лично от обилия скобок в глазах рябит
Цитата
Ну в хаскеле типизация статическая, с этим проблем нет.
Я говорил не о хаскеле, там только типизированные proper lists, т.е. список может содержать элементы только одного типа. А joba вроде как лисп пишет, хотя я в этом уже не уверен, поэтому я и спрашиваю как он будет это дело разруливать, тем более без статической типизации.
Цитата
В лиспе все макросы на самом деле являются функциями.
А иначе это уже не лисп.

joba

Members


Статус

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))
foo
(4-) (foo <)
true
(5-) (foo =)
false
 
А если со спецформами (and и т.д.) нельзя такого делать, то они тогда значит не первоклассные.

>У Shen окружение довольно легко реализовать, т.к. почти все содержится в переменных

Мы говорили не об этом. Мы говорили о том, что в их eval нельзя передать окружение.

>Какое может быть частичное применение у макроса?

У спецформы может быть, легко. Но спецформы для этого должны быть первоклассными, как в kernel.

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#5723   2012-02-06 03:12 GMT+3 часа(ов)      
>Первоклассность заключается в том, что все макросы на самом деле являются функциями.

Нет. При стратегии call-by-value ты никак не сделаешь, например, and или if функциями.

joba

Members


Статус

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

Members


Статус

300 сообщений

Где: ---
Род занятий:
Возраст:

#5725   2012-02-06 11:43 GMT+3 часа(ов)      
Цитата
joba :
Нет. При стратегии call-by-value ты никак не сделаешь, например, and или if функциями.


Да. Любой макрос в лиспе - функция, которая принимает некоторую форму и возвращает форму. Со стратегией вычисления это не связано никак.

Цитата
В частности, объект первого класса должен иметь возможность передаваться в функции как параметр.

Прекрасно, в CL и в Racket макросы можно передавать как параметры. Следовательно, макросы - первоклассны.

Цитата
Kernel is a conservative, Scheme-like dialect of Lisp in which everything is a first-class object.

Вообще суть в чем - кернел ничем не отличается от обычного лиспа с точки зрения выразительности. Просто если в лиспе есть отдельные функции типа expand/compile, которые соответствуют стадиям исполнения формы, в кернеле этих стадий нет - они введены явно внутрь вычисления каждой формы. Из-за чего возникает очень много неудобств - начиная невозможностью компиляции и отсутствием partial-expand (например, в таком ЯП нельзя реализовать аналогичные Racket internal-definition, а если и можно - реализация будет в десятки раз длиннее), заканчивая низкой производительностью и отсутствием макросов. В чем смысл такой первоклассности - которая не содержит никаких плюсов, но содержит кучу минусов, не ясно.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5732   2012-02-07 01:05 GMT+3 часа(ов)      
Цитата
Я в том смысле, что не факт, что ты увидишь результат.
Тогда не говори, что ты реализуешь лучше. Говори, что попытаешься реализовать лучше.
Цитата
Но мы же говорили про Shen, в котором квадратные и фигурные скобки прописаны в стандарте и от них уже никак не избавишься.
Ну, он же позиционируется автором как учебный язык. Т.е. игрушка для школьника.
Цитата
И что тебе не нравится?
Для функции же работает такая хрень:

(3-) (define foo X -> (X 3 6))

foo

(4-) (foo <)

true

(5-) (foo =)

false



А если со спецформами (and и т.д.) нельзя такого делать, то они тогда значит не первоклассные.
Ты же знаешь как работает funcall, поэтому я не буду тебе объяснять, почему так происходит. Замечу только, что and, походу, особым образом обрабатывается на стадии компиляции. Не знаю зачем так усложнять себе жизнь
А вообще, как ты себе это представляешь, т.е. по-твоему функция должна была автоматически перекомпилировать выражение (X false (/ 1 0))? Ну так дык, записал бы
(define foo X -> (eval [X false [/ 1 0]]))

Цитата
У спецформы может быть, легко. Но спецформы для этого должны быть первоклассными, как в kernel.
Так и говори, что у тебя нет макросов, а есть спецформы. Т.е. ты реализовываешь не лисп, а что-то другое (со скобками как у лиспа). Но тогда зачем вообще нужны эти спецформы, когда можно обойтись функциями?

отредактировал(а) misha: 2012-02-07 01:37 GMT+3 часа(ов)

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#5735   2012-02-08 18:35 GMT+3 часа(ов)      
>Тогда не говори, что ты реализуешь лучше. Говори, что попытаешься реализовать лучше.

Нет, я реализую лучше, например, у меня в паттернах будут allowed не только конструкторы. Но ты, возможно, не сможешь увидеть мою реализацию (это не значит, что вероятность того, что я это все таки реализую, уменьшается, это значит лишь то, что вероятность того, что ты увидишь мою реализацию не очень-то велика).

>Ну, он же позиционируется автором как учебный язык. Т.е. игрушка для школьника.

Не, ну ты так говорил раньше, что будто бы мой диалект никому ненужен (кроме возможно меня), потому что есть Shen.

>Ты же знаешь как работает funcall, поэтому я не буду тебе объяснять, почему так происходит. Замечу только, что and, походу, особым образом обрабатывается на стадии компиляции. Не знаю зачем так усложнять себе жизнь

Я лишь хотел сказать, что макросы в Shen не являются первоклассными объектами.

>Но тогда зачем вообще нужны эти спецформы, когда можно обойтись функциями?

Нельзя. Лямбду (спецформа lambda), например, ты никак не представишь в виде функции, какую бы ты стратегию не использовал, будь то call-by-need(name,value).

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#5736   2012-02-08 22:16 GMT+3 часа(ов)      
Цитата
Но ты, возможно, не сможешь увидеть мою реализацию
А какова причина?
misha
Если тебе он нужен, то можешь реализовать. А так... есть Shen
Цитата
Не, ну ты так говорил раньше, что будто бы мой диалект никому ненужен (кроме возможно меня), потому что есть Shen.
Если программа не нужна ее автору, то, возможно, она никому не нужна. Т.е. прежде чем приступать к работе нужно все заранее взвесить. Кстати, Shen был всего лишь примером языка, на базе которого ты можешь реализовать свой, или хотя бы доработать сам Shen. Т.к. существует реализация Shen на самом себе, я подумал, что тебе будет проще продумать дизайн собственного языка.
Цитата
Я лишь хотел сказать, что макросы в Shen не являются первоклассными объектами.
Вообще-то там они первоклассные.
Цитата
Нельзя. Лямбду (спецформа lambda), например, ты никак не представишь в виде функции, какую бы ты стратегию не использовал, будь то call-by-need(name,value).
Я не говорил о полном отказе. Они пускай будут, но их количество должно быть минимально возможным. Поэтому я бы запретил их создание пользователем.


Онлайн :

0 пользователь(ей), 28 гость(ей) :




Реклама на сайте: