-1
Ruby的遞歸如何被'破壞'以禁用ruby方法進行遞歸的能力?在Ruby中禁用遞歸以強制使用Y Combinator
需要創建一個程序來教授lambda微積分,但使用Ruby。從克羅克福德
動機上的JavaScript - https://www.youtube.com/watch?v=ya4UHuXNygM&feature=youtu.be&t=1h9m53s
Ruby的遞歸如何被'破壞'以禁用ruby方法進行遞歸的能力?在Ruby中禁用遞歸以強制使用Y Combinator
需要創建一個程序來教授lambda微積分,但使用Ruby。從克羅克福德
動機上的JavaScript - https://www.youtube.com/watch?v=ya4UHuXNygM&feature=youtu.be&t=1h9m53s
您可以使用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`.
什麼是你想實現什麼? –
你能詳細說一下嗎? – sawa
即使它存在,它的應用程序也會破壞近102%的核心ruby功能。 – mudasobwa