作者: Tsutomu Hiroshima
日時: 2002/4/09(14:03)
From: saw@... (Yさ)
Subject: [TSabc:43] 初心者向け言語の比較の参考に
Date: Mon, 8 Apr 2002 16:54:47 +0900
Message-ID: <200204080754.g387slY15624@...>

> [お題]簡易足し算器
> [内容]入力された数字を合計し、表示する。
>  0が入力されるまで数字を受け付け、合計し続ける。
>  0が入力されるとそれまでの合計を表示する。
> 
> どなたかその他の(スクリプト)言語による例をお願いいたします(^o^)/

廣島です.

MIT で アリゴリズムの講義に使われる Scheme の例です.
(初心者の言語とはいいがたいけど参考までに)

;;; 解1 
;;; 終端再起を使った素直な解
(display
 (let loop ((total 0))
   (let ((num (read)))
     (if (zero? num)
	 total
	 (begin
	   (set! total (+ total num))
	   (loop total))))))

;;; 解2
;;; 継続の呼び出しでループから脱出するマニアな解
(display
 (let ((total 0))
   (call-with-current-continuation
    (lambda (break)
      (let loop ()
	(let ((num (read)))
	  (if (zero? num)
	      (break total)
	      (begin
		(set! total (+ total num))		
		(loop)))))))))

;;; 解3
;;; 継続の呼び出しでループを実現するひねくれた解
(display
 (let ((total 0))
   (let ((next (call-with-current-continuation (lambda (k) k))))
     (let ((num (read)))
       (if (zero? num)
	   total
	   (begin
	     (set! total (+ total num))
	     (next next)))))))

;;; 解4
;;; 解2と解3を組み合せてループとループからの脱出を
;;; ともに継続で実現した病的な解
(display
 (let ((total 0))
   (call-with-current-continuation
    (lambda (break)
      (let ((next (call-with-current-continuation (lambda (k) k))))
	(let ((num (read)))
	  (if (zero? num)
	      (break total)
	      (begin 
		(set! total (+ total num))
		(next next)))))))))

;;;;;;;;;;;;;;;;;;;;
;;; 継続は力なり ;;;
;;;;;;;;;;;;;;;;;;;;

引数を取る Version は R5RS に準拠しなくなるので省略.
-----------------------------
	廣島 勉
	(tsutomu@...)