LINUX.ORG.RU

Раз уж lester снова с нами


0

0

Чем закончилась та эпопея с интепретатором?

Я таки переломался и доделал: http://code.google.com/p/task303/source/browse/testf.lisp .

PS: Лисповый time() походу берет несколько параметров а + не конкатенирует строки. Надо выражения при через flet обернуть, но сегодня влом.

★★★

Re: Раз уж lester снова с нами

я не доделал, забил практически сразу; каюсь, можете мешать меня с говном

и в ближайшее будущее, увы, будет не до этого

jtootf ★★★★★ ()

Re: Раз уж lester снова с нами

Я свою поделку на лиспе выкладывал.

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

k_andy ★★★ ()
Ответ на: Re: Раз уж lester снова с нами от jtootf

Re: Раз уж lester снова с нами

>я не доделал, забил практически сразу; каюсь, можете мешать меня с говном

А какой концепт там хоть намечался? Я иходный файл конвертировал в lisp-овый код, разворачивая выражения в обратную польскую нотацию по алгоритму наподобие Дейкстры а потом компилировал. В Хаскеле я так понимаю это решается иначе?

Absurd ★★★ ()
Ответ на: Re: Раз уж lester снова с нами от Absurd

Re: Раз уж lester снова с нами

>А какой концепт там хоть намечался?

парсер на parsec с семантическими действиями по месту (почти EBNF), ленивое вычисление обращений к существующим объектам. если хочешь, могу парсер куда-нибудь выложить (сам парсер всего 118 строк и довольно читаемый)

самая большая сложность у меня была с time(), первый вариант был через unsafePerformIO, потом пришлось переделать

jtootf ★★★★★ ()
Ответ на: Re: Раз уж lester снова с нами от jtootf

Re: Раз уж lester снова с нами

>>А какой концепт там хоть намечался?

>парсер на parsec с семантическими действиями по месту (почти EBNF),

Ну я-то без привлечения либ сделал. Коряво, правда.

>могу парсер куда-нибудь выложить (сам парсер всего 118 строк и довольно читаемый)

Давай конечно.

Absurd ★★★ ()

Re: Раз уж lester снова с нами

а где результаты? там вроде пару тестов надо было на время прогнать

lester ★★★★ ()
Ответ на: Re: Раз уж lester снова с нами от lester

Re: Раз уж lester снова с нами

Файл вида

# Some comment

object A
{
   color = "red";
   value = qqtime();
   rectangle;
}

object B : A, C
{
   color = "green";
   circle;
}

object C
{
   value = qqtime();
   square;
}

object D
{
   color = "blue";
   value = 8 + A.value;
   value2 = log((A.value * value) ^ 3 + 1);
}

show rectangle.value;
show circle.color;
show D.value2;

Запуск: (100000 Итераций)

time sbcl --script testf.lisp test3.txt 100000

real 0m26.512s user 0m0.015s sys 0m0.015s

Липовая функция time для этого не подходит, написал свою qqtime такого вида. Если надо чтобы она называлась time надо ее подменять при парсинге.

(defun qqtime (&rest args)
  (get-universal-time))
Absurd ★★★ ()

Re: Раз уж lester снова с нами

Нашел свой пост с результатами( еще на старом P4 ):

Test1 - 1.08сек

iterations = 10000000;
log = off;

object A
{
circle;
color = "red";
value = sqrt(100);
}

object B : A, C, D
{
circle;
color = "green";
}

object C : D
{
value = time();
square;
}

object D
{
color = "blue";
value = 235 + A.value + sqrt( 100 );
value2 = C.value * value + value4;
value3 = value2 * time();
value4 = 20;
}

object E : B {}
object F : B {}
object G : B {}
object H : B {}
object I : B {}
object J : B {}

show B.color;
show circle;
show D.value;
show D.value4;
show sqrt( sqrt( J.value ) );


Test2 - 8.17сек

iterations = 1000000;
log = off;

object A { value = time(); value2 = sqrt( time() ) - C.value; }
object B { value = A.value; }
object C : B { value = ( 1000 / 500 + 1 * ( 1 + 1 ) ) * ( sqrt( sqrt( ( 50 + 50 ) * 2 + 56 ) + 9 ) + 2 ); }
object D : A {}

show A.value2;
show C.value;
show B.value;
show D.value;

lester ★★★★ ()
Ответ на: Re: Раз уж lester снова с нами от lester

Re: Раз уж lester снова с нами

bash-3.2$ cat ./test3.txt
object A {
       value = qqtime();
       value2 = sqrt(qqtime()) - C.value;
}

object B {
       value = A.value;
}

object C : B {
       value = ( 1000 / 500 + 1 * ( 1 + 1 ) ) * ( sqrt( sqrt( ( 50 + 50 ) * 2 + 56 ) + 9 ) + 2 );
}

object D : A {}

show A.value2;
show C.value;
show B.value;
show D.value;

bash-3.2$ cat ./q.sh
sbcl --script ./testf.lisp ./test3.txt 100000 >/dev/null

bash-3.2$ time ./q.sh

real    0m6.098s
user    0m0.061s
sys     0m0.046s

Но проц у меня - кора дуба.

Absurd ★★★ ()
Ответ на: Re: Раз уж lester снова с нами от lester

Re: Раз уж lester снова с нами

Да в целом тоже самое - 6.4 секунды на том же количестве итераций. Поскольку он честно рекурсивно ходит по деревьям наследования при каждом вычислении значения поля и ничего не кэширует, он должен работать чуть дольше. По факту на 0.4 секунды дольше.

Absurd ★★★ ()
Ответ на: Re: Раз уж lester снова с нами от Absurd

Re: Раз уж lester снова с нами

> Да в целом тоже самое - 6.4 секунды на том же количестве итераций

взять что-ли добить свой вариант... тем более помню узкое место - у меня промежуточные результаты в vector складываются, профайлер показал, что около 80% из-за этого уходит на аллокацию/деаллокацию, но это не раньше чем завтра - сейчас работы куча на руках

lester ★★★★ ()
Ответ на: Re: Раз уж lester снова с нами от lester

Re: Раз уж lester снова с нами

>> Да в целом тоже самое - 6.4 секунды на том же количестве итераций

>взять что-ли добить свой вариант... тем более помню узкое место - у меня промежуточные результаты в vector складываются, профайлер показал, что около 80% из-за этого уходит на аллокацию/деаллокацию, но это не раньше чем завтра - сейчас работы куча на руках

Насколько я понимаю, там вектор не нужен: При помощи алгоритма Дейкстры строится дерево из полиморфных объектов с единственной виртуальной функцией eval(), после чего будет вызыван eval() у корневого объекта который вернет значение выражения. У констант eval() будет возвращать значение константы, у переменных она будет выфетчивать значение переменной а у операций она будет применять операцию к тем двум значениям которые вернули вызовы eval у дочерних объектов, ну итд.

Absurd ★★★ ()
Ответ на: Re: Раз уж lester снова с нами от Absurd

Re: Раз уж lester снова с нами

> При помощи алгоритма Дейкстры строится дерево из полиморфных объектов с единственной виртуальной функцией eval()

я вычисляю все на стеке - надо будет вариант с деревом проверить, но то уже после доведения до ума старого кода, чтоб сравнение корректное біло

lester ★★★★ ()

Re: Раз уж lester снова с нами

Ёмана... а почему так много кода-то?

balodja ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.