作者: Tsutomu Hiroshima
日時: 2002/4/09(16:11)
From: 閑舎 <raku@...>
Subject: [TSabc:59] Re: 初心者向け言語の比較の参考に(Scheme の場合)
Date: Tue, 09 Apr 2002 14:46:32 +0900 (LMT)
Message-ID: <20020409144632R.raku@...>

> Scheme ってこういう書き方ができるとは便利ですね。Emacs Lisp だと、
> 
> (let ((loop t) (total 0))
>   (while loop
> 	(setq num (read-minibuffer ""))
> 	(if (= num 0)
> 		(progn (setq loop nil)
> 			   (message (format "%f" total))
> 			   (sleep-for 2))
> 	  (setq total (+ total num))
> )))
> 
> というような書き方しか思いつきません。

廣島です.

Scheme では終端再帰を正しく実装することを R5RS が要求しています.

Lisp は詳しくないのですけど,

___ Emacs Lisp が終端再帰を正しく実装しているならば,___

(defun compute-total (total)
  (let ((num (read-minibuffer "")))
    (if (= num 0)
	total
      (compute-total (+ total num)))))
(message (format "%f" (compute-total 0)))

も解です.
正しい終端再帰なら,スタックが積み重ならないので,
これで本当の繰り返しが実現できます.

また,Emacs Lisp でも Tcl と同じく Catch & Throw が使えますから,

(message (format "%f"
		 (catch 'break
		   (let ((total 0))
		     (while t
		       (let ((num (read-minibuffer "")))
			 (if (= num 0)
			     (throw 'break total)
			   (setq total (+ total num)))))))))

も,解です.

-----------------------------
	廣島 勉
	(tsutomu@...)