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

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

Kergan

Members


Статус

300 сообщений

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

#5679   2012-02-04 15:34 GMT+3 часа(ов)      
Цитата
Ну так в чем проблема? Это ведь легко реализовать.

Написать новый eval? Других способов нет

Цитата
define - это ридер-макрос, т.е. ридер преобразует его в s-выражение.

Это не важно. Важно, что нарушается соответствие между кодом и АСТ.

misha

Moderators


Статус

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

#5680   2012-02-04 15:48 GMT+3 часа(ов)      
Цитата
Это не важно. Важно, что нарушается соответствие между кодом и АСТ.

Shen не является классическим диалектом лиспа. Да и где оно рарушается?
(0-) (defmacro unless-macro
[unless TEST EXPR] -> [if TEST false EXPR])
macro
unless-macro
 
(1-) (unless false 12)
12
 
(2-) (if)
#<FUNCTION :LAMBDA (#:Y18396)
(lambda #:Y18397 (lambda #:Y18398 (if #:Y18396 #:Y18397 #:Y18398)))>
 
(3-) ((if) false 1 0)
0
 
(4-) (if true 1 0)
1

отредактировал(а) misha: 2012-02-04 16:08 GMT+3 часа(ов)

Kergan

Members


Статус

300 сообщений

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

#5681   2012-02-04 16:36 GMT+3 часа(ов)      
Цитата
Да и где оно рарушается?

я же указал, где: "не проставлены скобки вокруг "0 -> 1" и "N -> (* N (factorial (- N 1)))" , которые должны там быть.".
Со скобками код представляет АСТ безо всяких трансформаций, без скобок - нужна трансформация, чтобы получить АСТ из кода.

Цитата
(if)

shen ленивый чтоли?

misha

Moderators


Статус

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

#5682   2012-02-04 16:57 GMT+3 часа(ов)      
Цитата
Со скобками код представляет АСТ безо всяких трансформаций, без скобок - нужна трансформация, чтобы получить АСТ из кода.
Трансформация все равно нужна. АСТ - это простой список. Трансформация нужна для последующих стадий компиляции. Упрощенно экспанд можно представить как АСТ-1 --> АСТ-2 --> ... --> АСТ-N. Скобки нужны для упрощения трансформации, т.е. как синтаксический сахар.
Цитата
shen ленивый чтоли?
Нет. Макросы используют сопоставление с образцом.

Kergan

Members


Статус

300 сообщений

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

#5683   2012-02-04 17:08 GMT+3 часа(ов)      
Цитата
Трансформация все равно нужна.

Нет, всегда можно расставить скобки так, что трансформация не нужна.

Цитата
Скобки нужны для упрощения трансформации, т.е. как синтаксический сахар.

Скобки нужны, чтобы трансформации ообще не было - в этом случае сам код является АСТ'ом, что упрощает разбор, генерацию и вообще написание макросов. Если скобок недостаточно - нам придется проводить синтаксический разбор в уме.

Цитата
Нет. Макросы используют сопоставление с образцом.

Я не о том. Если shen не ленивый, то из if нельзя сделать функцию, как она каррируется-то? Оно ведь не будет корректно работать.

misha

Moderators


Статус

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

#5684   2012-02-04 17:21 GMT+3 часа(ов)      
Цитата
Нет, всегда можно расставить скобки так, что трансформация не нужна.

CG-USER(1): (macroexpand '(cond (T 12)))
(IF T (PROGN 12) NIL)
T

Цитата
Если скобок недостаточно - нам придется проводить синтаксический разбор в уме.
А его и так придется производить, если ты о чтении кода.
Цитата
Я не о том. Если shen не ленивый, то из if нельзя сделать функцию, как она каррируется-то? Оно ведь не будет корректно работать.
(0-) (defmacro unless-macro
[unless] -> [/. test [unless test]]
[unless TEST] -> [/. expr [unless TEST expr]]
[unless TEST EXPR] -> [if TEST false EXPR])
macro
unless-macro
 
(1-) (unless)
#<FUNCTION :LAMBDA (test)
#'(LAMBDA (expr) (IF (shen-wrapper test) 'false expr))>
 
(2-) ((unless) true 12)
false
 
(3-) ((unless false) 1234)
1234
 
(4-) (unless true 12345)
false

Kergan

Members


Статус

300 сообщений

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

#5685   2012-02-04 18:11 GMT+3 часа(ов)      
для кода "(cond (T 12))" АСТ будет '(cond (T 12)) - никакой трансформации.

Цитата
А его и так придется производить, если ты о чтении кода.


Если скобок достатончое количество - не придется. Так как в этом случае код - это и есть АСТ.

Цитата
(unless)

ну и что будет, если я напишу (((unless) false) (display 'x))?

misha

Moderators


Статус

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

#5686   2012-02-04 18:37 GMT+3 часа(ов)      
Цитата
для кода "(cond (T 12))" АСТ будет '(cond (T 12)) - никакой трансформации.

Цитата
Если скобок достатончое количество - не придется. Так как в этом случае код - это и есть АСТ.
Что значит никакой? Я же привел пример. Короче, я не понимаю в чем заключается проблема? Читать код Shen непривычно? А макрос loop из CL, а (#t . if . 1 2) из рэкета, да и `(1 2 . ,(+ 1 2)) - дискомфорта не вызывает?
Цитата
ну и что будет, если я напишу (((unless) false) (display 'x))?
Напечатает x, даже при true.
(1-) (((unless) false) print + 1)
+1
 
(2-) (((if) true) print + 1)
11
 
(3-) (((if) false) print + 1)
1
 
(4-) (((unless) true) (print 1))
1false
 
(5-) (((unless) false) print 1)
11
 
(6-) (((unless) false) (print x))
xx
 
(7-) (((unless) true) (print x))
xfalse

Kergan

Members


Статус

300 сообщений

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

#5687   2012-02-04 18:43 GMT+3 часа(ов)      
Цитата
Что значит никакой? Я же привел пример.

В твоем примере код это и есть АСТ, никакой трансформации не требуется.

Цитата
Читать код Shen непривычно?

Нет, проблема в том, что нужно в уме производить синтаксический разбор кода.

Цитата
А макрос loop из CL

обладает теми же недостатками. Именно по-этому loop и плох

Цитата
а (#t . if . 1 2) из рэкета, да и `(1 2 . ,(+ 1 2)) - дискомфорта не вызывает?

а точку нельзя использовать много раз. То есть (1 . + . 2 . + . 3) или `(1 2 . ,(+ 1 2) . ,(+ 3 4)) не напишешь.

Цитата
Напечатает x, даже при true.

Н о чем и речь - некорректное поведение. Нафиг такое "недокаррирование"?

misha

Moderators


Статус

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

#5688   2012-02-04 18:56 GMT+3 часа(ов)      
Цитата
В твоем примере код это и есть АСТ, никакой трансформации не требуется.
Цитата
Нет, проблема в том, что нужно в уме производить синтаксический разбор кода.
Цитата
обладает теми же недостатками. Именно по-этому loop и плох
Так мог бы просто написать, что тебе неудобно читать, а не вести разговор об АСТ.
Цитата
а точку нельзя использовать много раз. То есть (1 . + . 2 . + . 3) или `(1 2 . ,(+ 1 2) . ,(+ 3 4)) не напишешь.
Захотят, будет можно.
Цитата
Н о чем и речь - некорректное поведение. Нафиг такое "недокаррирование"?
А ты какое хотел? Ведь (unless) => #<lambda>

Kergan

Members


Статус

300 сообщений

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

#5689   2012-02-04 19:28 GMT+3 часа(ов)      
Цитата
Так мог бы просто написать, что тебе неудобно читать, а не вести разговор об АСТ.

При чем тут удобство чтения? Я говорю о вполне объективных вещах - требуется ли производить синтаксический разбор для построения АСТ или не требуется. Это оказывает кардинальное влияние на написание макросов.

Цитата
Захотят, будет можно.


Ну вот когда захотят - тогда и будет об этом говорить, а пока гомоиконность синтаксиса сохраняется.

Цитата
А ты какое хотел?

Ну если нормально каррировать форму нельзя - то вообще никак не надо. Во избежание.

misha

Moderators


Статус

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

#5690   2012-02-04 19:48 GMT+3 часа(ов)      
Цитата
Я говорю о вполне объективных вещах - требуется ли производить синтаксический разбор для построения АСТ или не требуется.
Синтаксический разбор производится в специальных формах типа define. Но если не требуется паттерн матчинг, то сгодится и обычный defun
(0-) (defun f (a b) [+ a b])
f
 
(1-) (f x y)
[+ x y]
 
(2-) (f 1 2)
[+ 1 2]

Цитата
пока гомоиконность синтаксиса сохраняется.
(#t . if . 1 2) - а это что нормальное s-выражение?
Цитата
Ну если нормально каррировать форму нельзя - то вообще никак не надо.
Каррировать или нет - это твое дело.

Kergan

Members


Статус

300 сообщений

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

#5691   2012-02-04 20:44 GMT+3 часа(ов)      
Цитата
Но если не требуется паттерн матчинг, то сгодится и обычный defun

А если требуется - то приходится делать разбор.

Цитата
(#t . if . 1 2) - а это что нормальное s-выражение?

Да, нормальное. Ненормальные варианты я указывал.

Цитата
Каррировать или нет - это твое дело.

Тут проблема в том, что это не каррирование. Оно только выглядит как каррирование.

misha

Moderators


Статус

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

#5692   2012-02-04 22:07 GMT+3 часа(ов)      
Цитата
А если требуется - то приходится делать разбор.
Так не ты же его делаешь
Цитата
Да, нормальное. Ненормальные варианты я указывал.
А тут не приходится делать синтаксический разбор? Кстати, этот синтаксис даже в r7rs не прописан.
Цитата
Тут проблема в том, что это не каррирование. Оно только выглядит как каррирование.
Главное не зевать и все будет в порядке.

Kergan

Members


Статус

300 сообщений

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

#5693   2012-02-05 00:18 GMT+3 часа(ов)      
Цитата
Так не ты же его делаешь


А кто? Именно мне делать и приходится. Так как, например, чтобы распарсить форму - мне надо знать, во что эта форма раскроется. И наоборот - чтобы эту форму сгенерить, мне надо знать результат ридера.

Цитата
А тут не приходится делать синтаксический разбор?

по сути нет

misha

Moderators


Статус

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

#5694   2012-02-05 00:41 GMT+3 часа(ов)      
Цитата
Именно мне делать и приходится. Так как, например, чтобы распарсить форму - мне надо знать, во что эта форма раскроется.
Допустим, не знаешь ты синтаксиса case. Какой тебе вариант покажется нагляднее, со скобками или без?
CG-USER(1): (setf (macro-function 'kernel-case) (macro-function 'case))
#<macro CASE @ #x210fa1fa>
CG-USER(2): (defmacro case (val &rest body)
`(kernel-case ,val
,@(loop while body
for x = (loop for i = (pop body)
until (eq i '->)
collect i)
when x
collect (list x (pop body))
else
collect (list t (pop body)))))
CASE
CG-USER(3): (case 'a
c b n -> 1
d a -> 2
-> 0)
2
 

Цитата
по сути нет
Почему нет?

joba

Members


Статус

157 сообщений

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

#5695   2012-02-05 01:09 GMT+3 часа(ов)      
>Это настраиваемая в рантайме опция.

Я рад за них. Но type checking у них все равно возможен только статический.

>Реализуешь лучше?

Угу.

>> В-третьих, синтаксис довольно далек от чистого s-expressions.
>Обоснуй.

Квадратные и фигурные скобки, например.

>Значит производительность тебя не волнует.

Волнует. Но не в первую очередь.

>Разделение пространств имен - это правильный шаг.

Макросы не являются первоклассными объектами. Это очень неудобно.

>А зачем? Eval использует текущее пространство имен.

Для реализации объекта make-module, с помощью которого можно будет создавать модули, например. Для реализации аналога vau-calculi, типа как в kernel.

>> В-седьмых, есть строки как базовый тип объектов - лишняя сущность.
>Обоснуй.

Occam razor, например. Не нужно будет создавать специальные функции для строк, а можно будет использовать те же, что и для списков.

joba

Members


Статус

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

Members


Статус

157 сообщений

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

#5698   2012-02-05 02:16 GMT+3 часа(ов)      
>shen ленивый чтоли?

Неа, просто в нем после частичного применения if превращается в нечто другое.
(4-) (if true 0 (/ 1 0))
0
(5-) ((if) true 0 (/ 1 0))
/: division by zero
Короче, полный бред.

misha

Moderators


Статус

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

#5699   2012-02-05 02:29 GMT+3 часа(ов)      
Цитата
Но type checking у них все равно возможен только статический.
Такой и нужен. А вообще типов там маловато, т.е. придется создавать новые, а иначе ничего толкового на нем не напишешь.
Цитата
>Реализуешь лучше?

Угу.
Смотри, буду проверять
Цитата
Квадратные и фигурные скобки, например.


Если ты добавишь поддержку ридер-макросов, то сам сможешь реализовать что-то подобное.

Цитата
Макросы не являются первоклассными объектами. Это очень неудобно.

(0-) (defmacro unless-macro
[unless] -> [/. test [unless test]]
[unless TEST] -> [/. expr [unless TEST expr]]
[unless TEST EXPR] -> [if TEST false EXPR])
macro
unless-macro
 
(1-) (unless false (+ 1 2 3))
6
 
(2-) (unless-macro [unless false [+ 1 2 3]])
[if false false [+ 1 [+ 2 3]]]
 
(3-) (unless-macro [unless false])
[lambda expr [if false false expr]]

Цитата
Для реализации объекта make-module, с помощью которого можно будет создавать модули, например.
Это вроде как уже кто-то реализовал. Я толком не интересовался. В конце концов я ведь только выступаю в роли адвоката т.е. я не использую его для разработки.
Цитата
Не нужно будет создавать специальные функции для строк, а можно будет использовать те же, что и для списков.
Зато это упрощает парсинг строки
(define remove-my-name
{string --> string}
"" -> ""
(@s "Mark" Str) -> (remove-my-name Str)
(@s S Str) -> (@s S (remove-my-name Str)))

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

misha

Moderators


Статус

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

#5700   2012-02-05 02:34 GMT+3 часа(ов)      
Цитата
(5-) ((if) true 0 (/ 1 0))

/: division by zero

Короче, полный бред.
А так должно быть. Это ведь прописано в стандарте.
(0-) (if)
#<FUNCTION :LAMBDA (#:Y18411)
(lambda #:Y18412 (lambda #:Y18413 (if #:Y18411 #:Y18412 #:Y18413)))>
Т.е. ты вызываешь функцию, а не макрос.

joba

Members


Статус

157 сообщений

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

#5701   2012-02-05 04:20 GMT+3 часа(ов)      
>Такой и нужен.

Такой есть уже в хаскелл.

>Смотри, буду проверять

Я не обещаю, что выложу код здесь, я сказал "возможно".

>Если ты добавишь поддержку ридер-макросов, то сам сможешь реализовать что-то подобное.

Проблема не в этом, реализовать-то я смогу, но это уже будут не s-exprs.

>(defmacro unless-macro ...

Фигня какая-то. Вот:
(26-) (define foo X -> (X false (/ 1 0)))
foo
(28-) (foo and)
/: division by zero
(29-) (and false (/ 1 0))
false

Т.е. он подставляет не and, а какую-то функцию. Феерический бред.

>Это вроде как уже кто-то реализовал. Я толком не интересовался. В конце концов я ведь только выступаю в роли адвоката т.е. я не использую его для разработки.

Сомневаюсь, что они реализовали что-то дельное. Но все равно это был пример. Передавать окружение еще много где нужно.

>Зато это упрощает парсинг строки

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

joba

Members


Статус

157 сообщений

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

#5702   2012-02-05 04:21 GMT+3 часа(ов)      
>А так должно быть. Это ведь прописано в стандарте.

Ну тогда это уже не частичное применение.

Kergan

Members


Статус

300 сообщений

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

#5703   2012-02-05 12:12 GMT+3 часа(ов)      
Цитата
Допустим, не знаешь ты синтаксиса case. Какой тебе вариант покажется нагляднее, со скобками или без?

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

Kergan

Members


Статус

300 сообщений

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

#5704   2012-02-05 12:13 GMT+3 часа(ов)      
Цитата
Occam razor, например. Не нужно будет создавать специальные функции для строк, а можно будет использовать те же, что и для списков.

Но на самом-то деле нельзя - оно же жутко тормозить будет.

joba

Members


Статус

157 сообщений

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

#5705   2012-02-05 12:19 GMT+3 часа(ов)      
>Но на самом-то деле нельзя - оно же жутко тормозить будет.

В хаскелл работает и норм.

Kergan

Members


Статус

300 сообщений

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

#5706   2012-02-05 12:21 GMT+3 часа(ов)      
Цитата
Макросы не являются первоклассными объектами. Это очень неудобно.

В CL и в Racket - являются первоклассными.

Цитата
Для реализации аналога vau-calculi, типа как в kernel.

в vau передается лексический контекст, а не неймспейс, это разные вещи же.

Цитата
Но это плохой пример. Корректный and можно легко реализовать как функцию, если использовать стратегию call-by-need(или name).

Такие вещи в любом лиспе очень легко реализуются, но возникают определенные проблемы - во-первых, компилировать подобный ЯП по очевидным причинам нельзя. Во-вторых - макросов в подобном ЯП, по очевидным причинам, уже не будет. То есть макросы можно в некотором смысле смоделировать, но они не будут работать как полноценные макросы, т.к. нельзя написать expand. Ввести фазы и контролировать порядок исполнения тоже никак нельзя. Ну и все это будет совершенно жутчайшим образом тормозить.

Kergan

Members


Статус

300 сообщений

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

#5707   2012-02-05 12:23 GMT+3 часа(ов)      
Цитата
joba :
>Но на самом-то деле нельзя - оно же жутко тормозить будет.

В хаскелл работает и норм.


ну мне так кажется там соответствующие ф-и для строк перегружены, нет?

joba

Members


Статус

157 сообщений

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

#5708   2012-02-05 12:33 GMT+3 часа(ов)      
>В CL и в Racket - являются первоклассными.
> (define (foo x) (x #f #t))
> (foo and)
stdin::196: and: bad syntax in: and

>в vau передается лексический контекст, а не неймспейс, это разные вещи же.

Чо? Речь шла про eval, который в vau-calculi должен принимать окружение.

>компилировать подобный ЯП по очевидным причинам нельзя.

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

joba

Members


Статус

157 сообщений

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

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

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


Онлайн :

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




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