名前付きletを試してみよう

30分プログラム、その601。名前付きletを試してみよう。
Let Over Lambdaを読んでたら「Schemeには名前付きletってのがあるんだぜー。うらやましいからマクロで作ろうぜ」と書いてあった。
「へー、そんなのがあるんだ」と思ったので試してみた。マクロの定義を読んだときも思ったけど、関数内関数定義のシンタックスシュガーですね。

使い方

gosh> (fib 5)
8
gosh> (fact 10)
3628800

ソースコード

#! /opt/local/bin/gosh
;; -*- mode:scheme; coding:utf-8 -*-
;;
;; nlet.scm -
;;
;; Copyright(C) 2009 by mzp
;; Author: MIZUNO Hiroki / mzpppp at gmail dot com
;; http://howdyworld.org
;;
;; Timestamp: 2009/06/10 11:31:07
;;
;; This program is free software; you can redistribute it and/or
;; modify it under MIT Lincence.
;;

(define (fact n)
  (let facti [(n n)
	      (i 1)]
    (if (= n 0)
	i
	(facti (- n 1) (* n i)))))

(define (fib n)
  (let fibi [(current 1)
	     (prev    0)
	     (n       n)]
    (if (eq? n 0)
	current
	(fibi (+ current prev) current (- n 1)))))