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

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

misha

Moderators


Статус

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

#2928   2010-09-19 20:29 GMT+3 часа(ов)      
>Код на CL вообще не грамотный.
Объясните какой и почему?))

>Так может писать человек не представляющий что значат в CL стадии обработки кода.
Я думал, что у CL существуют навороченные макро-трансформеры, как у Racket, а оказалось, что нет.

>ander-skirnir прав - у вас явно какое-то предубеждение.
О каком предубеждении идет речь? Я привык к макросом не имеющим побочных эффектов, с удобной системой сопоставления с образцом. До R3RS Схема имела макросы имеющие различные побочные эффекты, но затем перешли на "гигиенические" макросы, т.е. макросы без побочных эффектов. И этот переход до сих пор считался прогрессом, а ander-skirnir спорит с этим. Или это не так?

отредактировал(а) misha: 2010-09-19 20:39 GMT+3 часа(ов)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2931   2010-09-19 21:19 GMT+3 часа(ов)      
> перешли на "гигиенические" макросы, т.е. макросы без побочных эффектов. И этот переход до сих пор считался прогрессом, а ander-skirnir спорит с этим.
Макросы, раскрытие которых навязывает let (flet, etc...), чаще предполагают отсутствие гигиены, потому что большинство иных случаев можно переписать, вынеся связывания за пределы целевого раскрытия. И второе - вводить гигиену гораздо легче, чем обходить.

misha

Moderators


Статус

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

#2932   2010-09-19 22:08 GMT+3 часа(ов)      
>И второе - вводить гигиену гораздо легче, чем обходить.
Эх, не читали Вы Пола Грэхема))
Как Вы будете реализовывать синтаксический захват определений
(let ([/ list])
(define-syntax (div? sx)
(syntax-case sx ()
((_ e1 e2) #'(/ e1 e2))))
(let ((/ *)) (div? 6 3)))
Угадали результат?

А ещё пространства имен синтаксического разбора
(define-syntax ++i 
(let ([i 0])
(lambda(stx)
(set! i (add1 i))
(datum->syntax stx i))))
> ++i
1
> ++i
2
Какой Вы сделали вывод? Имхо, это у Вас предубеждение, либо недостаток знания) или и то и другое вместе)

отредактировал(а) misha: 2010-09-19 22:18 GMT+3 часа(ов)

antares0

Members


Статус

185 сообщений

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

#2933   2010-09-19 22:35 GMT+3 часа(ов)      
Первре работа с окружением, второе , по-моему не отличается от замыкания. И то и другое будет примерно так же с попрвкой на CL. Непонятно как это все относится к гигиене.

antares0

Members


Статус

185 сообщений

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

#2934   2010-09-19 22:37 GMT+3 часа(ов)      
Хотя, да отличается

misha

Moderators


Статус

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

#2936   2010-09-19 23:18 GMT+3 часа(ов)      
Ответ на первое задание: '(6 3)

Напомню, ander-skirnir утверждал, что макросистема Рэкета - тупой копипаст. Ну, лично я так понял)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2939   2010-09-19 23:46 GMT+3 часа(ов)      
> ander-skirnir утверждал, что макросистема Рэкета - тупой копипаст. Ну, лично я так понял)
Весьма нелогично поняли. Если бы я такое утверждал, отсюда сразу следовало бы, что она меня целиком устраивает, потому что меня устраивает коммон-лисповская.

> Эх, не читали Вы Пола Грэхема))
Читали: и Грэмов, и Хойтов, и Сейбелей, и Лэмкинсов.

> Как Вы будете реализовывать синтаксический захват определений
А мы не будем реализовывать гигиенический трансформер.
Вместо этого мы просто будем вводить гигиену где надо gensym'ом.

И я так и не понял, что вы своим кодом хотели показать. Типа, что не так уж и сложно обходится, да?
А вы поглядите, как она вводится gensym'ом и поймёте.

misha

Moderators


Статус

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

#2941   2010-09-19 23:50 GMT+3 часа(ов)      
>А вы поглядите, как она вводится gensym'ом и поймёте.
Получится, но не то) Создайте мне навороченную гигиеническую макросистему (желательно простым копипастом), а не поделку типа так смог студент)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2943   2010-09-19 23:54 GMT+3 часа(ов)      
> Получится, но не то)
Разница аж в том, что ракетный трансформер сам переименовывает, а мы - ручками. Только суть в том, что не переименовывать нужно куда чаще.

> Создайте мне навороченную гигиеническую макросистему
В том то и дело, что ценность её отрицательна, учитывая вышесказанное.

antares0

Members


Статус

185 сообщений

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

#2944   2010-09-19 23:56 GMT+3 часа(ов)      
Цитата
misha :
Ответ на первое задание: '(6 3)


Значит я не угадал.

Цитата

Напомню, ander-skirnir утверждал, что макросистема Рэкета - тупой копипаст. Ну, лично я так понял)


По моему он утверждал другое. Хотя лично я в равной мере не понимаю вас обоих.

misha

Moderators


Статус

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

#2945   2010-09-19 23:59 GMT+3 часа(ов)      
>Только суть в том, что не переименовывать нужно куда чаще.
Отнеситесь с юмором:
Там, где пехота не пройдёт.
И бронепоезд не промчится,
Угрюмый танк не проползёт,
Там ander-skirnir на пузе проползет)

>В том то и дело, что ценность её отрицательна, учитывая вышесказанное.
Докажите?!)

P.S. Это все не то)

отредактировал(а) misha: 2010-09-20 00:05 GMT+3 часа(ов)

misha

Moderators


Статус

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

#2946   2010-09-20 00:02 GMT+3 часа(ов)      
>По моему он утверждал другое.
ander-skirnir писал:
"Не в обиду, но мне это напомнило "метапрограммирование шаблоны c++"
Вообще, ограничение макросов пределами одной фазы кажется преступлением против лиспа."

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2947   2010-09-20 00:11 GMT+3 часа(ов)      
> Не в обиду, но мне это напомнило "метапрограммирование шаблоны c++"
Я имел ввиду, что так же статично всё. Если в cl нам по большому счёту всё-равно, напишем мы программу целиком, а потом откомпилим, либо будем писать её на-ходу, то подход ракеты с её фазами - сначала написать - потом откомпилить. А repl, как и eval - скорее фичи (тут можно вспомнить, что в стандарте схемы и eval'a то не было).

> Докажите?!)
> P.S. Это все не то)
Как Вы могли заметить по графе `возраст', у меня сегодня День Рождения Ну и раз такое дело, может Вы приведите пример, где, как Вам кажется, автоматическая гигиена даёт выигрыш, а я перепишу то же с gensym'ом на cl?

misha

Moderators


Статус

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

#2952   2010-09-20 00:59 GMT+3 часа(ов)      
Поздравляю Вас с Днем Рождения!!! Дай Бог Вам здоровья и удачи) а остальное возникнет само собой) И не забывайте писать побольше реальных программ на Лиспе, которыми Вы могли бы гордится)


>Я имел ввиду, что так же статично всё.
Надеюсь, Вы убедились что это не так?

>подход ракеты с её фазами - сначала написать - потом откомпилить.
И да и нет) При необходимости Вы можете не компилировать, а подгружать. К сожалению, у Рэкета плохо описаны некоторые дополнительные возможности (а мне лень копать), ибо судя по описанию он позволяет реализовать (и откомпилировать) практически любой язык программирования(включая CL). Если Вы не знали, то на Рэкете написаны R5RS, R6RS, и другие академические языки.

>А repl, как и eval - скорее фичи (тут можно вспомнить, что в стандарте схемы и eval'a то не было).
Но были макросы с сайд-эффектами) Как Вы любите)

>Ну и раз такое дело, может Вы приведите пример, где, как Вам кажется, автоматическая гигиена даёт выигрыш, а я перепишу то же с gensym'ом на cl?
Дело не в выигрыше) суть в том - полезно ли это для реальных программ. Довольно трудно проанализировать работу сложного макроса, еще сложнее убедится в адекватности его работы)
Чем надежнее код тем лучше, а для оперирования сайд-эффектами есть Форт)

misha

Moderators


Статус

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

#2953   2010-09-20 01:05 GMT+3 часа(ов)      
И не забывайте, что первая реализация Схемы была реализована на MacLisp)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2954   2010-09-20 01:14 GMT+3 часа(ов)      
> Поздравляю Вас с Днем Рождения!!! Дай Бог Вам здоровья и удачи) а остальное возникнет само собой) И не забывайте писать побольше реальных программ на Лиспе, которыми Вы могли бы гордится)
Спасибо !

> Надеюсь, Вы убедились что это не так?
Да, но не слишком. При желании некоторого, но далеко не того, что в cl, динамизма можно добиться, пошаманив с синтаксическими объектами, но при таких усилиях оно того не стоит. Разве что сделать #lang common-lisp. Но это будет достаточно сложно, потому что у нормальных компиляторов cl очень сложная, многопроходная логика компиляции с нетривиальными коммон-лисп ориентированными оптимизациями, а самописный на рэките он явно будет тормознее самого рэкита.

> Дело не в выигрыше) суть в том - полезно ли это для реальных программ.
Ну это я и подразумеваю под выигрышем.

> Довольно трудно проанализировать работу сложного макроса, еще сложнее убедится в адекватности его работы)
Еще как только я собираюсь начинать писать макрос, я уже знаю, что у меня будет переименовано, а что заанафорено. Как раз это очень легко продумывается на самом деле.

> Чем надежнее код тем лучше, а для оперирования сайд-эффектами есть Форт)
Тогда почему бы не писать на template haskell? А на форте я пытался летом писать, но меня не особо впечатлило.
Очень низкоуровнево. Почти асм, но, конечно, удобнее. Вот фактор - тот приятен, но макросистема там куда слабее любых лиспов.
Зато поинт-фри круче, чем в хаски.

misha

Moderators


Статус

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

#2957   2010-09-20 01:47 GMT+3 часа(ов)      
>Но это будет достаточно сложно, потому что у нормальных компиляторов cl очень сложная, многопроходная логика компиляции с нетривиальными коммон-лисп ориентированными оптимизациями, а самописный на рэките он явно будет тормознее самого рэкита.
Рэкит компилирует в x86, но ориентированный для собственной виртуальной машины (как и SBCL). Единственное его слабое место (или это его сильные места?): динамический стек и поддержка continuations. К сожалению, иногда это приводит к уменьшению производительности в 2-4 раза, и обычно зависит от задач, поэтому иногда приходится переписывать одну и туже функцию по нескольку раз.

>Как раз это очень легко продумывается на самом деле.
Если Вы пишите код сами, а попробуйте разобраться с чьей-либо библиотекой. Когда я пытался использовать GTK, мне приходилось разбираться чужыми библиотеками. Длина некоторых содержащихся в них макросов превышало 35 строк. Я занимался тем, что разбивал их по частям, и оптимизировал их под свою реализацию.

>А на форте я пытался летом писать, но меня не особо впечатлило.
Макросистема Форта практически гигиенична) шаг влево, шаг вправо - расстрел на месте) Почти как у Рэкета)

отредактировал(а) misha: 2010-09-20 01:53 GMT+3 часа(ов)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2966   2010-09-20 03:14 GMT+3 часа(ов)      
> Если Вы пишите код сами, а попробуйте разобраться с чьей-либо библиотекой.
На любом языке можно писать запутанный код с плохой декомпозицией.

> Макросистема Форта практически гигиенична)
IMMEDIATE слова сложно назвать макросистемой

LinkFly

Members


Статус

152 сообщений

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

#2975   2010-09-21 01:48 GMT+3 часа(ов)      
misha чтобы на с вами получить какой-нибудь профит от дискуссии, давайте так:
- сформулируйте конкретную задачу, в которой необходимо применить возможности макросистемы.
- решите её на Racket
- я её напишу на CL

А пока я не вижу точки опоры, с помощью которой можно рассуждать о коде типа (let (...) (defmacro ...) ..)

misha

Moderators


Статус

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

#2980   2010-09-21 15:47 GMT+3 часа(ов)      
>misha чтобы на с вами получить какой-нибудь профит от дискуссии
Вы мне лучше представьте как раскрывается код типа (let (...) (defmacro ...) ..), а то я не пойму почему представленный мной ранее код некорректен. Т.е. мне нужны стадии макротрансформации с объяснениями.

LinkFly

Members


Статус

152 сообщений

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

#2981   2010-09-21 16:21 GMT+3 часа(ов)      
А я не говорил, что он не корректен, я говорил что он не грамотен.
Вопрос корректности/не корректности я в данный момент не рассматриваю.
И я говорил про стадии обработки кода, а не про стадии макротрансформации.
Обработка кода, более общее понятие.

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

antares0

Members


Статус

185 сообщений

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

#2987   2010-09-21 16:43 GMT+3 часа(ов)      
Цитата
misha :
Вы мне лучше представьте как раскрывается код типа (let (...) (defmacro ...) ..), а то я не пойму почему представленный мной ранее код некорректен. Т.е. мне нужны стадии макротрансформации с объяснениями.


Некорректен потому что defmacro должен вычисляться в нулевом лексическом окружении или использовать macrolet.
Что такое стадии макротрансформации я в данном случае понимаю с трудом.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2989   2010-09-21 16:46 GMT+3 часа(ов)      
> defmacro должен вычисляться в нулевом лексическом окружении
Нет, не должен. (let (...) (defmacro ...)) - это уже не nil-environment. Как-раз "вычисляется" он (то есть, его macro-function) в текущем lexenv'е, а связывание пропихивается в топлевел.

antares0

Members


Статус

185 сообщений

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

#2990   2010-09-21 16:49 GMT+3 часа(ов)      
Я об этом и говорю, может не ясно выразился.
P.S. Не в nil а в null, если уж на ненашеском.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2991   2010-09-21 16:54 GMT+3 часа(ов)      
Ага, значит я не так понял. Вообще, я заметил, это очень сложная задача - подбирать корректные слова для описания тонкостей cl.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#2992   2010-09-21 16:57 GMT+3 часа(ов)      
> стадии макротрансформации
Это, например, что-то в таком стиле, только помощнее:
(eval-when (:compile-toplevel :load-toplevel :execute)
(let (macroses-for-phase-0)
(defmacro defmacro/phase-0 (&rest definition)
(push definition macroses-for-phase-0) nil)
(defmacro defmacro/phase-1 (name args &body body)
`(defmacro ,name ,args
(macrolet ,macroses-for-phase-0
,@body)))))
 


Просто в ракете макросы строго по фазам расписываются, поэтому любители ракеты оперируют такой терминологией.

отредактировал(а) ander-skirnir: 2010-09-21 17:06 GMT+3 часа(ов)

misha

Moderators


Статус

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

#2995   2010-09-22 01:16 GMT+3 часа(ов)      
>Это, например, что-то в таком стиле, только помощнее
А как этим пользоваться? Уточню предыдущий вопрос, мне бы хотелось видеть как раскрываются let, defun и defmacro.

misha

Moderators


Статус

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

#2996   2010-09-22 01:28 GMT+3 часа(ов)      
Я написал динамическую надстройку для Racket, чтобы повторить работу гипотетического Лиспа.
(define-syntax (dynamic-syntax so)
(syntax-case so ()
[(_ expr ...)
(with-syntax ([exprs
(datum->syntax
so
(map (lambda (e)
(list 'eval (list 'quasiquote e)))
(syntax->datum #'(expr ...))))])
#'(begin . exprs))]))
 
(define-syntax (dynamic-racket so)
(syntax-case so ()
[(_ expr ...)
#'(begin
(require racket/sandbox)
(define eval (make-evaluator 'racket))
(current-eval eval)
(eval `(current-output-port ,(current-output-port)))
(eval `(current-input-port ,(current-input-port)))
(dynamic-syntax expr ...))]))
 
(dynamic-racket
(require racket/splicing)
 
(define-syntax (incf so)
(syntax-case so ()
[(_ id) #'(begin (set! id (add1 id)) id)]))
 
(define-syntax (defun so)
(syntax-case so ()
[(_ id formals body ...)
#'(eval-syntax #`(define (id . formals) body ...))]))
 
; (setq x 56)
; (defmacro m () (incf x))
; (defun x+1 () (m))
(define x 56)
(defun macros-m () (incf x))
(defun x+1 () #,(macros-m))
 
; (let ((i 0))
; (defmacro ++i () (incf i))
; (defun $i () i)
; (defun i=1 () (++i))
; (defun i=2 () (++i)))
; (defun i=3 () (++i))
(splicing-let
([i 0])
(define (macros-++i) (incf i))
(defun $i () i)
(defun i=1 () #,(macros-++i))
(defun i=2 () #,(macros-++i)))
; top-level
(defun i=3 () #,(macros-++i)))

misha

Moderators


Статус

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

#2997   2010-09-22 01:33 GMT+3 часа(ов)      
Тест надстройки:
> x
57
> (x+1)
57
> ($i)
3
> (i=2)
2
> (i=3)
3

misha

Moderators


Статус

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

#3000   2010-09-22 02:02 GMT+3 часа(ов)      
Еще тест:
> (define (zz) '(+ x 1))
> (zz)
'(+ x 1)
> (defun kk () #,(zz))
> (kk)
58
> (kk)
58
> (define (zz) '(+ x 1))
> (define (zz x) '(+ x 1))
> (defun kk () #,(zz x))
> (kk)
58
> (defun kk () (let ([x 1]) #,(zz x)))
> (kk)
2


Онлайн :

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