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

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

misha

Moderators


Статус

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

#4525   2011-07-03 20:25 GMT+3 часа(ов)      
Цитата
Ах, ок, вы написали пример макроса, который не работает, но то, что он не работает - не беда, потому что вы не собираетесь его применять?

Не работает? А по мне так наоборот, просто нужно уметь с ним работать.
Цитата
Я тогда не понимаю, чего вы тогда взбеленились, когда я указал на пару критичных недостатков этого макроса?

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

А вот это уже сарказм. Я себе подобное позволял?
Цитата
Я не описывал генерацию промежуточного кода.

Просто это так называется.

Kergan

Members


Статус

300 сообщений

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

#4526   2011-07-03 20:37 GMT+3 часа(ов)      
Цитата
Не работает?

выдавать невнятную ошибку в случае, когда должен быть коректны результат - да, это не работает.

Цитата
А по мне так наоборот, просто нужно уметь с ним работать.

Вы не понимаете очевидного. В каждом ЯП есть свои принципы написания кода. В Racket макросы гигиенические и они _должны_ быть гигиеническими и безопасными. Если гигиена и нарушается - это должно быть сделано контролируемо, так, чтобы не приводило к некорректному поведению. И PLT team затратили множество усилиий на то, чтобы так и было. Вы же пишете макросы, под которые язык просто не расчитан. Вот смотрите, в том же CL есть система пекеджей, которая предотвратит 90% проблем, связанных с негигиеничностью макроса. В Racket такого нет, потому что подразумевается, что макрос гигиеничен. Понимаете? И в данном случае "уметь работать с макросом" = не писать макросы, которые раскрываются в ваш infix (и даже в этом случае я не уверен, что вы не словите в каком-то случае какую-нибудь херь), потому что если писать - то нету реального способа проконтролировать некорректное использование. пользователь модуля, который пользуется модулем, в котором использован модуль, в котором применяется ваш onfix: не обязан уметь применять ваш infix:. Он даже не должен вообще знать о том, что какой-то infix: там в недрах применяется.

Цитата
А вот это уже сарказм.

Вообще-то я серьезно. Ну в самом деле - я вам привел многократные примеры, когда в простейшей ситуации вместо корректного поведения ваш макрос дает неотлавливаемый изнутри эррор или undefined behavior, вы мне ответили, мол "да я и не собирался его использовать". Я вас неверно понял или что?

Цитата
Прошу прощения! Но мне показалось, что вы меня начали учить уму разуму.

Повторяю - я просто указал на пару очевидных недостатков одного конкретного макроса в контексте одного конкретного языка. На Racket такие макросы писать нельзя, за такое надо отрывать руки. Точка. Если бы это был CL - я бы и слова не сказал.

Цитата
Просто это так называется.

Что именно?

Kergan

Members


Статус

300 сообщений

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

#4527   2011-07-03 20:42 GMT+3 часа(ов)      
Ой, я, кажется, понял, что подразумевалось под "уметь использовать"

 
(define-syntax (my-macro stx)
(let ([x (gensym)])
(datum->syntax stx
#`(let ([#,x 10])
(infix: #,x + #,x)))))
 

misha

Moderators


Статус

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

#4528   2011-07-04 03:26 GMT+3 часа(ов)      
Цитата
выдавать невнятную ошибку в случае, когда должен быть коректны результат - да, это не работает.

Достаточно придерживаться простых правил:
1) "Принцип однородности".
Нельзя использовать "не гигиенические" макросы в теле гигиенических.
2) Все используемые "не гигиенические" макросы должны быть экспортированы.
3) Отказаться от модулей и перейти на пакеты
Цитата
Вообще-то я серьезно. Ну в самом деле - я вам привел многократные примеры, когда в простейшей ситуации вместо корректного поведения ваш макрос дает неотлавливаемый изнутри эррор или undefined behavior, вы мне ответили, мол "да я и не собирался его использовать". Я вас неверно понял или что?

Мне нужен был транслятор, но так как я посчитал, что транслировать константное выражение каждый раз, когда оно необходимо - просто тупо, поэтому и оформил его в виде макроса. Мне не нужен был макрос для постоянного использования. Я даже не предполагал, что он вызовет такую бурную дискуссию.
Цитата
Что именно?

Процесс который вы описывали относится к стадии создания промежуточного кода.
Цитата
Ой, я, кажется, понял, что подразумевалось под "уметь использовать"

Почти угадали
(define-values (stdout stdin pid stderr dotForth)
(let ([params (process "dotForth.exe /process")])
(values (first params)
(second params)
(third params)
(fourth params)
(fifth params))))
 
(void (read-line stdout)) ; hello #\n
(display "[ " stdin)
(display-lines
(lisp->forth (infix: #%test 1 + 2 * 3 > 4))
stdin
#:separator #\space)
(displayln "puti ]" stdin)
(flush-output stdin)
(read-line stdout) ; [ 1 2 3 * + 4 > puti ] => "1" eq #t
 
(dotForthGet "using-assembly \"System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\"")
(dotForthGet "using System.Windows.Forms")
 
(dotForthGet "class public sealed : TestForm ( ) {")
(dotForthGet " method public static : Win () Void {")
(dotForthGet " variable f Form")
(dotForthGet " newobj( Form ) =: f")
(dotForthGet " f s\" Hello, world!\" virt( Form.set_Text String )")
(dotForthGet " f call( Application.Run Form )")
(dotForthGet " } .method")
(dotForthGet "} .class")
 
(dotForthGet "[ call( TestForm.Win ) ]") ; Создадим окно
; P.S. Все dotForthGet должны вернуть ""

Kergan

Members


Статус

300 сообщений

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

#4529   2011-07-04 12:15 GMT+3 часа(ов)      
Цитата
Достаточно придерживаться простых правил:
1) "Принцип однородности".
Нельзя использовать "не гигиенические" макросы в теле гигиенических.
2) Все используемые "не гигиенические" макросы должны быть экспортированы.

Другими словами - вы предлагаете полностью отказаться от встроенных механизмов гигиены, пытаясь вместо этого реализовывать ее руками при помощи костылей
Но зачем? Ради чего? Не проще ли сделать макрос гигиеническим и не парить мозг? То есть логично, что если мы отказываемся от многочисленных удобств и преимуществ - это не должно быть просто так

Цитата
3) Отказаться от модулей и перейти на пакеты

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

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

Цитата
Процесс который вы описывали относится к стадии создания промежуточного кода.

Я не могу понять - какой процесс и что вы называете "промежуточным кодом".

Цитата
Почти угадали

Руками лепить генсимы в ЯП с автоматической гигиеной - это нечто, ага

misha

Moderators


Статус

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

#4530   2011-07-04 13:06 GMT+3 часа(ов)      
Цитата
Kergan :
Цитата
Достаточно придерживаться простых правил:
1) "Принцип однородности".
Нельзя использовать "не гигиенические" макросы в теле гигиенических.
2) Все используемые "не гигиенические" макросы должны быть экспортированы.

Другими словами - вы предлагаете полностью отказаться от встроенных механизмов гигиены, пытаясь вместо этого реализовывать ее руками при помощи костылей
Но зачем? Ради чего? Не проще ли сделать макрос гигиеническим и не парить мозг? То есть логично, что если мы отказываемся от многочисленных удобств и преимуществ - это не должно быть просто так

Цитата
3) Отказаться от модулей и перейти на пакеты

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


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

Я считаю, что смешивание двух разных стилей плохая идея.
Цитата
Я не могу понять - какой процесс и что вы называете "промежуточным кодом".

В данном случае промежуточным кодом является финальный синтаксический объект после всех экспандов. А у CL - это АСД(список) + environment.
Цитата
Руками лепить генсимы в ЯП с автоматической гигиеной - это нечто, ага

И при этом использовать
(define-syntax (defmacro so)
(syntax-case so ()
[(_ id formals body ...)
#'(define-syntax id
(let ([macros (lambda formals body ...)])
(lambda (stx) (datum->syntax stx (apply macros (cdr (syntax->datum stx)))))))]))

Kergan

Members


Статус

300 сообщений

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

#4531   2011-07-04 14:16 GMT+3 часа(ов)      
Цитата
Я считаю, что смешивание двух разных стилей плохая идея.

Так я вам именно об этом и говорю
В Racket макросы по дефолту гигиенические, если вы делаете их негигиеническими - это смешение стилей.

Цитата
В данном случае промежуточным кодом является финальный синтаксический объект после всех экспандов.

Ах, ок, я просто всегда называл это full-expanded code.

Цитата
И при этом использовать

Но зачем? Ведь на паттернах макросы писать гораздо проще и быстрее, чем обрабатывая списки руками.

misha

Moderators


Статус

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

#4535   2011-07-05 13:47 GMT+3 часа(ов)      
Цитата
В Racket макросы по дефолту гигиенические, если вы делаете их негигиеническими - это смешение стилей.

Так оно и есть. Но ведь и смешивание без "предупреждения" инфиксного и постфиксного кода также является плохой идеей.
Цитата
Ах, ок, я просто всегда называл это full-expanded code.

Ну, так fully-expanded code имеет более общее название - intermediate code.
Цитата
Но зачем? Ведь на паттернах макросы писать гораздо проще и быстрее, чем обрабатывая списки руками.

Все зависит от ситуации. Ведь мощные паттерны существуют только у Racket, а у большинства r6rs реализаций их нет. Но с другой стороны, они имеют средства для обработки синтаксических объектов вручную.

misha

Moderators


Статус

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

#4536   2011-07-05 13:55 GMT+3 часа(ов)      
Я немного исправил свой макрос, сделав его гигиеническим. (исходник)
>(infix: 6 + (4 * 5 + 8) * 7 + 23)
225
> (infix: #%test 1 + 2 * - (- 3) > - 4)
'(> (+ 1 (* 2 (- (- 3)))) (- 4))
> (infix: #%test - x() + 78 * - - f([5 + 6]) < 8 * 90)
'(< (+ (- (x)) (* 78 (- (- (f (+ 5 6)))))) (* 8 90))
> (infix: #%test [ 4 > 5 ? 5 * - - f(): 6 + 8 * 9])
'(if (> 4 5) (* 5 (- (- (f)))) (+ 6 (* 8 9)))
> (infix: #%test 23 + [ 4 > 5 ? 5 * - - f() : 6 + 8 * 9] > 7)
'(> (+ 23 (if (> 4 5) (* 5 (- (- (f)))) (+ 6 (* 8 9)))) 7)


Пишите, если обнаружите ошибки.

Kergan

Members


Статус

300 сообщений

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

#4538   2011-07-05 18:09 GMT+3 часа(ов)      
Цитата
Так оно и есть. Но ведь и смешивание без "предупреждения" инфиксного и постфиксного кода также является плохой идеей.

Нет, не является. Практически во всех языках есть такое смешивание - и ничего

Цитата
Ну, так fully-expanded code имеет более общее название - intermediate code.

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

Цитата
Все зависит от ситуации. Ведь мощные паттерны существуют только у Racket, а у большинства r6rs реализаций их нет. Но с другой стороны, они имеют средства для обработки синтаксических объектов вручную.

В лиспе есть анонимные функции, а в си их нет. С другой стороны, си имеет средства для того, чтобы их эмулировать их вручную

Цитата
Пишите, если обнаружите ошибки.

С гигиеной все, кажется, в порядке, а вот по части алгоритма - у вас там функции с set! вызываются изнутри тела match. А если внутри match произойдет бектрекинг? Вы гарантируете, что его не будет? К слову, ваша реализация работает в полтора раза медленнее моей

misha

Moderators


Статус

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

#4540   2011-07-06 14:45 GMT+3 часа(ов)      
Цитата
Нет, не является. Практически во всех языках есть такое смешивание - и ничего

Вы о каких языках? У большинства ведь есть ограничения в виде синтаксиса и сложной семантики.
Цитата
А если внутри match произойдет бектрекинг? Вы гарантируете, что его не будет?

У меня он не реализован. В случае обнаружения синтаксической ошибки посылается исключение.
Цитата
К слову, ваша реализация работает в полтора раза медленнее моей

Это из-за поддержки конструкции [ test ? then : else ], но я уже оптимизировал данный процесс.

Kergan

Members


Статус

300 сообщений

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

#4543   2011-07-07 03:04 GMT+3 часа(ов)      
Цитата
Вы о каких языках?

Да практически обо всех. Там спокойно соседствуют инфиксные операторы и префиксные функциональные вызовы. И ничего. Это какбе привычное, устоявшееся смешение стилей

Цитата
У меня он не реализован.

Он не у вас реализован, он есть в match по дефолту.

Цитата
В случае обнаружения синтаксической ошибки посылается исключение.

Ну это в том случае, если никакой паттерн не сматчится. а если начнет матчиться паттерн 1, на середине обломится, потом начнет матчится паттерн 2 и будет успшено сматчен? Корчое в данном случае сайдэффекты лепить не стоит, потому что внутри match вы никак не контролируете control-flow.

Цитата
Это из-за поддержки конструкции [ test ? then : else ]

Вы уверены? Паттерн выглядит простеньким.

misha

Moderators


Статус

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

#4544   2011-07-09 15:22 GMT+3 часа(ов)      
Цитата
Да практически обо всех. Там спокойно соседствуют инфиксные операторы и префиксные функциональные вызовы. И ничего. Это какбе привычное, устоявшееся смешение стилей

У них есть синтаксис и сложная семантика, а у рэкета их нет, да и ваш язык их не предусматриваете. Поэтому он неправильно отреагирует на выражение типа
(map - '(1 2 3))

Цитата
Ну это в том случае, если никакой паттерн не сматчится. а если начнет матчиться паттерн 1, на середине обломится, потом начнет матчится паттерн 2 и будет успшено сматчен? Корчое в данном случае сайдэффекты лепить не стоит, потому что внутри match вы никак не контролируете control-flow.

О какой версии исходника идет речь? Приведите пример "опасного" выражения.
Цитата
Вы уверены? Паттерн выглядит простеньким.

А вы учли накладные расходы?

misha

Moderators


Статус

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

#4545   2011-07-09 15:35 GMT+3 часа(ов)      
Цитата
Kergan :
Цитата
Ну, так fully-expanded code имеет более общее название - intermediate code.

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


А как по вашему должен выглядеть промежуточный код? Иначе, кто в своем уме будет использовать байт-код, если есть списки?
Синтаксические деревья (как и трехадресный код, постфиксная запись) могут использоваться в качестве промежуточного кода.

отредактировал(а) misha: 2011-07-09 15:44 GMT+3 часа(ов)

Kergan

Members


Статус

300 сообщений

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

#4546   2011-07-11 15:21 GMT+3 часа(ов)      
Цитата
(map - '(1 2 3))

Ну это уже проблема динамической типизации, тут ничего ни в каком языке не сделаешь. Я в данном случае пишу так: (map (-) `(1 2 3)).

Цитата
А как по вашему должен выглядеть промежуточный код? Иначе, кто в своем уме будет использовать байт-код, если есть списки?

Ну, например, в Racket идет компиляция в байткод

misha

Moderators


Статус

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

#4547   2011-07-11 23:11 GMT+3 часа(ов)      
Цитата
Ну это уже проблема динамической типизации, тут ничего ни в каком языке не сделаешь. Я в данном случае пишу так: (map (-) `(1 2 3)).

Поэтому я и рекомендовал перегрузить скобки. Либо использовать макрос. Кстати, для CL такой проблемы нет (mapcar #'- '(1 2 3))
Цитата
Ну, например, в Racket идет компиляция в байткод

Так это целевой код

Kergan

Members


Статус

300 сообщений

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

#4548   2011-07-12 15:03 GMT+3 часа(ов)      
Цитата
Поэтому я и рекомендовал перегрузить скобки.

Зачем? Ну и я уже говорил - в данном случае скобки перегружать нельзя, потмоу что работать не будет.

Цитата
Кстати, для CL такой проблемы нет (mapcar #'- '(1 2 3))

Ну так у меня тоже такой проблемы нет, как я уже сказал:
(map (-) `(1 2 3))

Kergan

Members


Статус

300 сообщений

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

#4549   2011-07-12 15:04 GMT+3 часа(ов)      
Цитата
Так это целевой код

целевой код - машинный, в который jit компилирует

misha

Moderators


Статус

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

#4550   2011-07-12 15:37 GMT+3 часа(ов)      
Цитата
Kergan :
Цитата
Так это целевой код

целевой код - машинный, в который jit компилирует

Я вижу подмену понятий, вызванную .net и java Вся фишка в том, что промежуточный код не является оптимизированным, да и кодом он называется условно, более правильно говорить о промежуточном представлении.
Большинство интерпретаторов паскаля компилируют в P-код, который является исполняемым (jit может вообще отсутствовать). Там оптимизированный P-код является целевым кодом.
Стадии компиляции:
создание промежуточного кода --> оптимизация промежуточного кода --> генерация целевого кода.

misha

Moderators


Статус

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

#4551   2011-07-12 15:41 GMT+3 часа(ов)      
Цитата
Ну так у меня тоже такой проблемы нет, как я уже сказал:
(map (-) `(1 2 3))

> (*)
1
> (+)
0
> (-)
-: expects at least 1 argument, given 0
> (/)
/: expects at least 1 argument, given 0

Kergan

Members


Статус

300 сообщений

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

#4552   2011-07-12 18:51 GMT+3 часа(ов)      
Цитата
Вся фишка в том, что промежуточный код не является оптимизированным, да и кодом он называется условно, более правильно говорить о промежуточном представлении.

Это все верно для байткода Racket. Собственно, байткод Racket - специальный диалект лиспа сам по себе.

Цитата
> (*)

1

> (+)

0

> (-)

-: expects at least 1 argument, given 0

> (/)

/: expects at least 1 argument, given 0

нет, у меня (x) транслируется в x, если x - инфиксный оператор.

megamanx

Members


Статус

307 сообщений

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

#4553   2011-07-12 22:19 GMT+3 часа(ов)      
Если нефиг делать - напишите реализацию, позволяющую производить неявное программирование, в т.ч. задавать функции без упоминания аргумента.
I wish I'd made you angry earlier

Kergan

Members


Статус

300 сообщений

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

#4554   2011-07-13 01:34 GMT+3 часа(ов)      
Цитата
Если нефиг делать - напишите реализацию, позволяющую производить неявное программирование, в т.ч. задавать функции без упоминания аргумента.

вот как-то так:
 
#lang racket
(require srfi/26)
(provide (except-out (all-from-out racket) #%app)
(rename-out [cut #%app]))
 

и потом писать: (map (* <> 2) `(1 2 3)) ; -> `(2 4 6)
правда будет захват только внутреннего выражения. По-хорошему надо переопределять фигурные скобки, например.

megamanx

Members


Статус

307 сообщений

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

#4555   2011-07-13 23:48 GMT+3 часа(ов)      
А вот реально реализовать такой синтаксис:
{[...][...][...]{[...][...]}}, где внутри {} каждая квадратная скобка выполняется своим потоком. Соответственно, вся {} выполняется, когда выполнятся все задания.
Меня просто интересует - есть какой-нибудь язык, или какая-нибудь примочка в каком-нибудь языке, которая бы самостоятельно, не изменяя (значительно) синтаксиса языка, брала на себя задачу по распараллеливанию. Примеры всяких RAD-систем, где окошки автоматом в свои потоки запихиваются, я не рассматриваю. Вроде как язык допускает написание чистых функций, параллелить можно. Или может, кто-то делал подобное.
I wish I'd made you angry earlier

Kergan

Members


Статус

300 сообщений

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

#4556   2011-07-15 01:49 GMT+3 часа(ов)      
Цитата
А вот реально реализовать такой синтаксис:

Ну а в чем проблема? Пусть {[] ...} ридером трансформируется в (parallel [] ...) где parallel - макрос, который запускает параллельно все свои аргументы, устанавливает семфор и ждет, пока он освободится.

misha

Moderators


Статус

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

#4557   2011-07-16 01:02 GMT+3 часа(ов)      
Цитата
Это все верно для байткода Racket. Собственно, байткод Racket - специальный диалект лиспа сам по себе.
Как байткод может быть диалектом лиспа? Его можно назвать промежуточным языком VM Racket (и то с натяжкой, т.к. он не имеет описания).
Цитата
нет, у меня (x) транслируется в x, если x - инфиксный оператор.

А это уже на K(J) похоже, там крючки и вилки описываются с помощью скобок.

misha

Moderators


Статус

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

#4558   2011-07-16 01:13 GMT+3 часа(ов)      
Цитата
Если нефиг делать - напишите реализацию, позволяющую производить неявное программирование, в т.ч. задавать функции без упоминания аргумента.

Имхо, в нете достаточно диалектов лиспа основанных на комбинаторной логике.

Kergan

Members


Статус

300 сообщений

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

#4559   2011-07-16 11:48 GMT+3 часа(ов)      
Цитата
Как байткод может быть диалектом лиспа?

он имеет списочную структуру (то есть выражения в виде head/rest). Собственно, можно сделать на любой модуль decompile и посмотреть - вот то что получится, это и есть байткод, с точностью до обозначений

Цитата
А это уже на K(J) похоже, там крючки и вилки описываются с помощью скобок.

ну и в хаскеле так же
у меня только сделан сахарок, чтобы можно было не писать скобки вокруг оператора, если он в head позиции. То есть можно (+ 1 2 3), а не ((+) 1 2 3).

misha

Moderators


Статус

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

#4560   2011-07-16 13:09 GMT+3 часа(ов)      
Цитата
он имеет списочную структуру (то есть выражения в виде head/rest). Собственно, можно сделать на любой модуль decompile и посмотреть - вот то что получится, это и есть байткод, с точностью до обозначений

Он имеет более сложную структуру, чем fasl, да и про оптимизацию не забудьте. А decompile работает наподобие .NET Reflector-а, поэтому не стоит говорить о сходстве с лиспом основываясь лишь на результате декомпиляции.

Kergan

Members


Статус

300 сообщений

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

#4561   2011-07-17 07:14 GMT+3 часа(ов)      
Цитата
Он имеет более сложную структуру, чем fasl

Не знаю, какая структура у fasl, а у байткода-таки списочная. Фактически, байткод - это и есть full-expanded, только проводятся банальные оптимизации (типа dead-code elimination или разворачивания рекурсии), имена глобальных символов заменяются абракадаброй, имена локальных - позицией в стеке. Все примитивы (типа begin, lambda, define, let etc.) в байткоде сохраняются.

Цитата
да и про оптимизацию не забудьте.

а она на структуру байткода и не влияет


Онлайн :

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




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