[解決済み]
、、、の4つの関数に似たものbase
がinit
ありfunc
ますsome
。はfunc
再帰的であり、それ自体を呼び出します。「停止の場合」では、呼び出しsome
てその値を返し、次に制御を「init
」に戻し、そこから呼び出されます。後者はかつてから呼び出されましbase
た。
base
-> init
-> func
-> init
-> func
-> some
|
_________+
|
v
; should continue from here (in `func`)
[もう違います]
代わりに、への最初の呼び出しの後、some
コントロールはに直接渡され、中間ペアの呼び出しbase
であると予想されるものをスキップします。(init,func)
私は実際に、、および再帰(たとえば、「相互末尾再帰」)を使用していくつかのより単純なケースを試しましblock
たreturn
がfactorial
、すべてうまくいきました。私はそれがヘルパー関数をfunc
使用していることを述べています(しかし、私はの例でさえ試しました、そしてそれは大丈夫でした); 私の実際のプログラムが問題を引き起こしている可能性があるものは何でもそうです。test
catch
throw
(catch 'test (throw 'test 0))
これはelisp
:それぞれがdefun
で始まり、次のようにblock
すべての関数がを使用return
します。
defun
[" / block
"から" "に切り替えましたdefun*
]
(defmacro 4+ (number)
"Add 4 to NUMBER, where NUMBER is a number."
(list 'setq number (list '1+ (list '1+ (list '1+ (list '1+ number))))))
(defmacro 4- (number)
"Subtract 4 from NUMBER, where NUMBER is a number."
(list 'setq number (list '1- (list '1- (list '1- (list '1- number))))))
(defun mesg (s &optional o)
"Use ATAB to tabulate message S at 4-multiple column; next/prev tab if O=1/0."
(when (null o) (setq o 0))
(case o (0 (4- atab)) (1 nil))
(message (concat "%" (format "%d" (+ atab (length s))) "s") s)
(case o (0 nil) (1 (4+ atab))))
(defun* base ()
(let (pack)
(setq atab 0)
(mesg "base->" 1)
(setq pack (init))
(mesg "<-base")))
(defun* init ()
(mesg "init->" 1)
(return-from init (progn (setq temp (func)) (mesg "<-init") temp)))
(defun* func (&optional pack)
(mesg "func->" 1)
(when (not (null pack)) (return-from func (progn (mesg "<+func") pack)))
(when (< 0 (mod (random) 2)); stop case
(return-from func (progn (setq temp (some)) (mesg "<-func") temp)))
(setq pack (init))
(case (mod (random) 2)
(0 (return-from func (progn (mesg "<0func") pack)))
(1 (return-from func (progn (setq temp (func pack)) (mesg "<1func") temp))) ; use tail-recursion instead of `while'
(t (error "foo bar"))))
(defun* some ()
(mesg "some->" 1)
(return-from some (progn (mesg "<-some") (list 2 3 4))))
(base)
pack
変数は私の値です-list
データ構造として。また、 「命令型」func
を回避するために、特別な累積パラメーターを使用して(末尾再帰呼び出しで)自分自身を繰り返すために使用します。 while
だから私が期待するものの代わりに(それぞれ>
はによってペアになってい<
ます)
base->
init->
func->
init->
func->
some->
<-some
<-func
<-init
func-> ; tail-recursion
<+func
<1func
<-init
<-base
私のプログラムは次のように動作します。
base
-> init
-> func
-> init
-> func
-> some
|
__________________________+
|
v
; control yielded here (to `base`)
[もう違います]
制御がプログラムの開始に戻るのが早すぎfunc
て、2回目return
の呼び出しからの最初の呼び出しで続行されないのはinit
なぜですか?
助けに感謝します、
セバスチャン