ruby не работает eval

Модератор: Модераторы разделов

Аватара пользователя
jojahti
Сообщения: 310

ruby не работает eval

Сообщение jojahti »

Код: Выделить всё

string ="puts '!'; string+=string; eval string; "
eval string

Почему от этого кода программа впадает в криостазис?

P.S.
Тьфу, это не программа тупит, а SciTe тупит.

P.P.S
Впрочем консоль тупит ещё больше.

P.P.P.S.

Код: Выделить всё

string ="puts '!'; eval string; "
eval string


Почему вот эта вот вещь не выполняется бесконечно?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: ruby не работает eval

Сообщение diesel »

jojahti писал(а):
16.08.2010 19:21
P.P.P.S.

Код: Выделить всё

string ="puts '!'; eval string; "
eval string


Почему вот эта вот вещь не выполняется бесконечно?


ну бесконечно - нет, но какое-то количество раз - да.

Код: Выделить всё

diesel@:~$ ruby tmp.rb 2> /dev/null | tail -1
4147!

diesel@:~$ cat tmp.rb
#/usr/bin/ruby
n = 1;
string ="puts n.to_s + '!'; n+=1; eval string; "
eval string

diesel@:~$ ruby -v
ruby 1.8.7 (2010-06-23 patchlevel 299) [i486-linux]


ну а дальше да:

Код: Выделить всё

stack level too deep (SystemStackError)
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: ruby не работает eval

Сообщение jojahti »

diesel
ну бесконечно - нет, но какое-то количество раз - да.

А у меня всего 2850.
Как-то странно. Какое здесь может быть ограничение? Неужели оно как-то рекурсивно обрабатывается? Типа вызов строки подставляется в исходную строку как функция.

Я хочу бесконечную рекурсиююю!!! Точнее что-бы она в оперативу разворачивалась как в gambit-c. )

Придётся делать без извращений, чё-то смущает меня этот внезапный оверфлоу.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: ruby не работает eval

Сообщение diesel »

jojahti писал(а):
16.08.2010 22:16
diesel
ну бесконечно - нет, но какое-то количество раз - да.

А у меня всего 2850.

ulimit -s можно немного увеличить, будет чуть больше

jojahti писал(а):
16.08.2010 22:16
Как-то странно. Какое здесь может быть ограничение? Неужели оно как-то рекурсивно обрабатывается? Типа вызов строки подставляется в исходную строку как функция.

ну да, оно скорее всего рекурсивно выполняется
Спасибо сказали:
Аватара пользователя
nickm
Сообщения: 203
ОС: RFRemix

Re: ruby не работает eval

Сообщение nickm »

А что за задача такая интересная, может её как-то по другому можно решить?
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: ruby не работает eval

Сообщение jojahti »

nickm
А что за задача такая интересная, может её как-то по другому можно решить?

1) Я собираюсь проанализировать книжку, извлечь все устойчивые сочетания слов.
2) на каждую фразу выдавать статистически самые частые варианты её развития.

Поначалу я делал это влоб, но выяснилось что даже пол странички обрабатывалось долго. Потому думаю нужно, что-бы каждое слово знало свои фразы и одинаковые концы фраз могли обмениваться своими вариантами развития, в противном случае боюсь, что конца разбора текста я просто не дождусь. :)

Конечно рекурсивно это получается красиво и компактно, но меня дико смущает большое количество вложенных функций вкупе с куцым лимитом на глубину рекурсии.(В ченджлогах писали, что рекурсию оптимизировали, но фигли они оптимизировали, если даже хвостовая рекурсия здесь неоптимизирована!?) Потому может мне все рекурсивные операции на итератарах сделать, что-бы избежать возможных проблем?

Предложение, умеющее возвращать из себя все возможные фразы пока что у меня выглядит так(да if у меня долбанутые, просто так визуально красивее):

Код: Выделить всё

#########################
class Word
    def initialize desc
            @item = desc[0]
            @fate = []
            @desc =  if (desc[1] != nil) then Word.new desc[1..-1] else nil end        #descendant word
    end

    def sevenfate    # !!!NEED REMEMBER!!!
        return fate([]) + @desc.sevenfate if @desc != nil
        return fate([]) if @desc == nil
    end

    def fate tail
        return [tail + [@item]] + @desc.fate(tail + [@item])  if @desc != nil
        return [tail+ [@item]] if @desc == nil
    end
end

word = Word.new ['neko','like','green','grass']
word.sevenfate.each{|item| p item}
Спасибо сказали:
Аватара пользователя
nickm
Сообщения: 203
ОС: RFRemix

Re: ruby не работает eval

Сообщение nickm »

Решил тут после обеда на коленке написать вариант подобного без рекурсии, а заодно и скорость потестить, вот что получилось (слова заменил на содержимое из Faker::Lorem.words гема):

http://pastebin.ca/1918752 wordpaste_orig.rb (вариант с рекурсией)

Код: Выделить всё

nickm@nickm ~/Desktop $ time ruby wordparse_orig.rb
31125

real    0m0.368s
user    0m0.326s
sys    0m0.028s


http://pastebin.ca/1918753 wordpaste_old.rb (без рекурсии, но результат получился "наоборот", добавил reverse)

Код: Выделить всё

nickm@nickm ~/Desktop $ time ruby wordparse_old.rb
31125

real    0m0.077s
user    0m0.056s
sys    0m0.015s

http://pastebin.ca/1918754 wordpaste.rb (попытка избавиться от reverse, индусокод и пляски с индексами массива, получилась фигня по скорости, больше чем с reverse :) )

Код: Выделить всё

nickm@nickm ~/Desktop $ time ruby wordparse.rb
31125

real    0m0.076s
user    0m0.068s
sys    0m0.004s



Кажется от жары моск расплавился и вытек через уши :crazy: . Есть варинты более красивого || быстрого кода?
Спасибо сказали:
Аватара пользователя
jojahti
Сообщения: 310

Re: ruby не работает eval

Сообщение jojahti »

Ну ладно, пока победил. :)
Спасибо сказали: