名前付き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)))))