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@...)