Человек может без устали смотреть как течет вода, как горит огонь и как работают другие люди.
А я как-то вот в учебных целях написал рисовалку фрактальных деревьев и с тех пор стараюсь её не запускать,
потому что не могу оторваться. Решил поделиться с общественностью. Может быть, кого-то еще порадует.
Брать здесь
Для работы потребуются .NET Framework 2.0 и Nemerle
Здравствуйте, Сергей Туленцев, Вы писали:
СТ>Человек может без устали смотреть как течет вода, как горит огонь и как работают другие люди.
ага, идеальный случай — пожар.
silent RSDN@Home 1.2.0 alpha [651] Windows XP 5.1.2600.131072
Здравствуйте, Сергей Туленцев, Вы писали:
СТ>Человек может без устали смотреть как течет вода, как горит огонь и как работают другие люди. СТ>А я как-то вот в учебных целях написал рисовалку фрактальных деревьев и с тех пор стараюсь её не запускать, СТ>потому что не могу оторваться. Решил поделиться с общественностью. Может быть, кого-то еще порадует. СТ>Брать здесь
Здравствуйте, Сергей Туленцев, Вы писали:
СТ>Для работы потребуются .NET Framework 2.0 и Nemerle
Ты в архив Nemerle.dll положи, тогда Nemerle не потребуется(как вариант можно еще утилитой ilmerge воспользоваться). У меня например Nemerle более новой версии(из svn) и как следствие пришлось твою программу перекомпилировать.
Здравствуйте, Vermicious Knid, Вы писали:
VK>Здравствуйте, Сергей Туленцев, Вы писали:
СТ>>Для работы потребуются .NET Framework 2.0 и Nemerle VK>Ты в архив Nemerle.dll положи, тогда Nemerle не потребуется(как вариант можно еще утилитой ilmerge воспользоваться). У меня например Nemerle более новой версии(из svn) и как следствие пришлось твою программу перекомпилировать.
Здравствуйте, Сергей Туленцев, Вы писали:
СТ>А я как-то вот в учебных целях написал рисовалку фрактальных деревьев и с тех пор стараюсь её не запускать, СТ>потому что не могу оторваться. Решил поделиться с общественностью. Может быть, кого-то еще порадует. СТ>Брать здесь
Прикольно, но решение явно не в духе Немерла.
Вот если бы реализовать на немерле DSL вроде на который дал ссылку
Здравствуйте, VladD2, Вы писали:
VD>Прикольно, но решение явно не в духе Немерла. VD>Вот если бы реализовать на немерле DSL вроде на который дал ссылку
McSeem2, то было бы не только прикольно и очень выразительно.
Вообще-то это и был намек, что если Немерле такой могучий, то почему "фишки нет"? Решение ничем не отличается, скажем, от Фортрановского. Но с другой стороны — а какое еще возможно? Например, этот Context Free — простейший интерпретатор с несложными правилами. Код интерпретируется исполняющей машиной, которая к Немерле или чему другому имеет очень слабое отношение — эта машина может быть написана на любом языке, и не будет принципиально отличаться. Если же ты намекаешь на генерацию кода во время компиляции (макросы и проч.), то это явно не та область, где подобные фокусы применимы — в случае более-менее сложной картинки любой компилятор просто вымрет как мамонт. В качестве доказательства — тот же Context Free формально умеет генерировать SVG-файл — это XML, содержащий векторные графические инструкции. Так вот, файлы получаются просто каких-то фантастических размеров. Таких же рамеров будет и AST.
Context Free работает потому, что он не хранит все ноды дерева — он их генерирует, исполняет и забывает, поэтому требует O(log N) памяти (по высоте дерева), где N — некая условная сложность картинки. Если же все по-честному разворачивать в код, то неизбежно получится O(N). Так вот вопрос — а можно ли так извернуться, чтобы сэмулировать на Немерле синтаксис, идейно похожий на ContextFree, но чтобы при этом компилятор не помер на дереве из миллиарда нодов?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Здравствуйте, McSeem2, Вы писали:
MS>Context Free работает потому, что он не хранит все ноды дерева — он их генерирует, исполняет и забывает, поэтому требует O(log N) памяти (по высоте дерева), где N — некая условная сложность картинки. Если же все по-честному разворачивать в код, то неизбежно получится O(N). Так вот вопрос — а можно ли так извернуться, чтобы сэмулировать на Немерле синтаксис, идейно похожий на ContextFree, но чтобы при этом компилятор не помер на дереве из миллиарда нодов?
А зачем генерить дерево нодов? Достаточно просто сгенерить кучу локальных функций.
Както так:
Это исходный DSL(на немерле будут косметеческие изменения)
startshape WHOLE
rule WHOLE {
QUAD { x -0.5 y -0.5 }
QUAD { x 0.5 y -0.5 }
QUAD { x 0.5 y 0.5 }
QUAD { x -0.5 y 0.5 }
}
rule QUAD {
FILL { }
}
rule QUAD 5 {
WHOLE { size 0.45 r 2 }
}
rule QUAD 0.5 {
// nothing
}
rule FILL {
SQUARE {
size 0.8
}
}
А это то что примерно нужно сгенерить
def WHOLE(x, y, r, size)
{
| _ when size < minSize => ();
| _ =>
{
QUAD ( x + -0.5, y + -0.5, r, size);
QUAD ( x + 0.5, y + -0.5, r, size);
QUAD ( x + 0.5, y + 0.5, r, size);
QUAD ( x + -0.5, y + 0.5, r, size);
}
}
def QUAD(x, y, r, size)
{
| _ when size < minSize => ();
| _ =>
match(rand(1 + 5 + 0.5))
{
| rnd when rnd < 1 => FILL (x, y, r, size);
| rnd when rnd < 1 + 5 => WHOLE (x, y, r + 2 , size * 0.45);
| rnd when rnd < 1 + 5 + 0.5 => ();
}
}
...
... << RSDN@Home 1.1.4 beta 6a rev. 436>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WolfHound, Вы писали:
WH>А зачем генерить дерево нодов? Достаточно просто сгенерить кучу локальных функций.
То есть, правильно ли я понимаю — каждому правилу будет соответствовать одна функция, которую можно сгенерировать из некоего птичьтего DSL при помощи тех же макросов?
То, что ты привел — это просто обыкновенные функции, текст которых можно сгенерировать из этого DSL хоть Перлом. И можно выдать хоть Сишный текст. Да я и вручную могу написать.
В чем же заключается этот самый "дух Немерле"? Для примера возьмем простейший случай на CFDG:
(1)
startshape spiral
rule spiral {
CIRCLE {}
spiral { s 0.95 y 1 r 20 }
}
В терминах Си будет примерно следующая рекурсивная функция:
Сами языки C, C++, C# и прочие не содержат средств для программирования некого компилятора из 1 в 2 — этот компилятор надо писать вручную, хоть на том же Си (Паскаль, Перл — не суть важно). Но ни Сишными макросами, ни C++cными шаблонами такое сделать невозможно. Вот мне и интересно, как же конкретно Немерле может здесь помочь? В смысле трансляции DSL->Nemerle в самом же исходнике?
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.