2016-02-19 26 views
-1

Ruby的遞歸如何被'破壞'以禁用ruby方法進行遞歸的能力?在Ruby中禁用遞歸以強制使用Y Combinator

需要創建一個程序來教授lambda微積分,但使用Ruby。從克羅克福德

動機上的JavaScript - https://www.youtube.com/watch?v=ya4UHuXNygM&feature=youtu.be&t=1h9m53s

+0

什麼是你想實現什麼? –

+0

你能詳細說一下嗎? – sawa

+1

即使它存在,它的應用程序也會破壞近102%的核心ruby功能。 – mudasobwa

回答

2

您可以使用TracePoint API來跟蹤所有方法調用和返回,並建立一個堆棧看到一個被調用的方法是否已經在堆棧中。這樣,你至少可以檢測遞歸,然後你可以只是raise一個例外或者exit這個程序。

喜歡的東西:

stack = [] 

TracePoint.trace(:call, :return) do |trace| 
    p trace, stack 
    method = trace.method_id 
    case trace.event 
    when :call 
    if stack.include?(method) 
     $stderr.puts "RECURSION DETECTED: method `#{stack.last}` calls method `#{method}`." 
     exit! 
    end 
    stack.push(method) 
    when :return 
    stack.pop 
    end 
end 

def foo; bar end 
def bar; baz end 
def baz; qux end 
def qux; bar end 

foo 

注意,我在那裏停留一個調試p RINT這樣就可以觀察它如何工作的:

#<TracePoint:call `foo'@./test.rb:20> 
[] 
#<TracePoint:call `bar'@./test.rb:21> 
[:foo] 
#<TracePoint:call `baz'@./test.rb:22> 
[:foo, :bar] 
#<TracePoint:call `qux'@./test.rb:23> 
[:foo, :bar, :baz] 
#<TracePoint:call `bar'@./test.rb:21> 
[:foo, :bar, :baz, :qux] 
RECURSION DETECTED: method `qux` calls method `bar`.