LINUX.ORG.RU

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


0

0

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

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

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

★★★

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

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

jtootf ★★★★★
()

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

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

k_andy ★★★
()
Ответ на: комментарий от jtootf

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

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

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

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

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

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

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

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

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

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

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

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

Absurd ★★★
() автор топика
Ответ на: комментарий от 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 ★★★
() автор топика

Нашел свой пост с результатами( еще на старом 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 ★★★★
()
Ответ на: комментарий от 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 ★★★
() автор топика
Ответ на: комментарий от lester

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

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

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

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

lester ★★★★
()
Ответ на: комментарий от lester

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

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

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

Absurd ★★★
() автор топика
Ответ на: комментарий от Absurd

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

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

lester ★★★★
()

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

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