続・継続
前回の追記に書いたmydefをメソッド定義にも使えるように微修正。
mac(mydef)^(name, func):
_ret := "return_" +
if (name.parent == Messenger):
(name.receiver.to_s() + "_" + name.message.to_s())
else:
name.to_s()
_body := Block.new([`(?_ret.intern() := return), *func.body.list])
_func := Function.new(func.params, _body)
`def(?name, ?_func)
mydef(findFirstNegative)^(arr):
arr.foreach^(elem):
if (elem < 0):
return_findFirstNegative(elem)
[]
mydef(List.findif)^(f):
.foreach^(elem):
if (f(elem)): return_List_findif(elem)
[]
a = [123, 45, -67, 8, -9]
say findFirstNegative(a) # => -67
say a.findif^(n){ n < 0 } # => -67それとshift, resetを写経してみた。(ここから)
mac(with_gensyms)^(&rest args):
syms := args.butlast().map^(sym): `(?sym := Symbol.generate())
`begin(?Block.new([syms | args.last1().list]))
meta_continuation = ^(v): error("No top-level RESET" + v)
mac(reset)^(body):
with_gensyms(mc, k, v, result):
`begin:
?mc := meta_continuation
callcc^(?k):
meta_continuation = ^(?v):
meta_continuation = ?mc
(?k)(?v)
?result := begin(?body)
meta_continuation(?result)
mac(shift)^(func):
with_gensyms(k, v, result):
`callcc^(?k):
?result := (?func)^(?v): reset: (?k)(?v)
meta_continuation(?result)
say([1] + reset{[2] + shift^(k){ [3] + k([4]) } + [5] })
# => [1, 3, 2, 4, 5]
say([1] + reset{ shift^(k){ [2] + k([3]) } + shift^(k){ [4] + k([5]) } + [6] })
# => [1, 2, 4, 3, 5, 6]で、次はどうすればいいんだっけ… srfi-41の移植か(違