Re: Refal interpreter


Subject: Re: Refal interpreter
From: A.A.Vladimirov (vladimi@mech.math.msu.su)
Date: Wed Jan 26 2005 - 14:06:02 MSK


В Втр, 25/01/2005 в 23:26 +0200, Leonid Belous пишет:

> Из-за того, что мне удается посчитать на Вашем тесте только 823! , а с 824
> выдается "Ошибка: слишком длинная строка."

Вам не удалось не __посчитать__ факториал, а __вывести результат на
печать__ (его десятичная запись превышает 2048 символов). Эта проблема
легко обходится (один из вариантов - в присоединённом файле).

Впрочем, возможно, имеет смысл переписать функции ввода/вывода, чтобы
они допускали работу со строками произвольной длины.

>
> Интересно узнать, как в Вашей реализации организована память и можно ли увеличить объем
> обрабатываемых выражений? Можете ли Вы посчитать 10000! ?

Да, у меня это получилось ;)

Организация памяти - обычная списочная (основные моменты описаны в
комментариях к refal.h и refal.c).

С уважением,
Антон Владимиров

#!/usr/bin/refal
$use 'stdio'
$use 'arithm'

$start k/print/k/symb/k/faktorial/ k/numb/k/gets/.... 10.

symb s/1/ = k/symb/ () s/1/.
        (e/1/) 0 = e/1/
        (e/1/) s/2/ = k/symb/ (k/add/k/mod/ s/2/ 10. 48. e/1/) k/div/ s/2/ 10..
        () 0 = 48

numb (s/1/) s/2/ e/3/ = k/numb/ (k/add/ k/mul/ 10 s/1/. k/sub/ s/2/ 48..) e/3/.
        (s/1/) = s/1/
        e/1/ = k/numb/ (0) e/1/.

faktorial 0 = 1
        s/1/ = k/mul/ s/1/ k/faktorial/ k/sub/s/1/ 1...

print =
        s/1/ e/2/ = k/puts/ s/1/. k/print/ e/2/.



This archive was generated by hypermail 2b25 : Wed Jan 26 2005 - 14:06:48 MSK