最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)

← 前のページに戻る

Lispインタプリターによる例題プログラム

このLispは、とてもシンプルなLispですが、いろいろとLispらしいプログラムを書くこともできます。

簡単なプログラムをまず作ってみましょう。

1. リストの長さを求める

リストの長さを求めるプログラムを作ってみましょう。

すべてのプログラムは、現在このLispでは、1行で入力しなければなりません。 しかし、最初から1行で入力しようとすると、括弧の対応をとるだけでもひと苦労になります。

そこで、まずは複数行で適当にインデントなどを入れながらプログラムを作成しましょう。


(define (length list)
        (cond
                ((equal list ()) 0)
                ((atom list) 1)
                (T (+ (length (cdr list)) 1))
        )
)

やっていることは、Lispを知っている人には簡単でしょう。

空リストなら0を返します。アトムなら1を返します。

そうでなければ引数のリストから最初の要素を取り出して、自分自身の関数を再帰で呼び出し、その結果に1を足して結果とします。

入力するときには、1行にまとめなければならないため、改行やタブをとります。


(define (length list)(cond ((equal list ()) 0)((atom list) 1)(T (+ (length (cdr list)) 1))))

ちょっと、不便ですね。

できるだけLispをシンプルに実現するために、こんな制約をつけてしまっていますが、 デカルト言語がわかる人はこのLispで複数行の入力ができるように改造するにはどうしたら考えてみるとよいでしょう。

実行してみます。


$ descartes -u lisp-utf8
Descartes Lisp/λ (c) 2010 H.Niwa
Ready
(define (length list)(cond ((equal list ()) 0)((atom list) 1)(T (+ (length (cdr list)) 1))))
(λ (list) (cond ((equal list ()) 0) ((atom list) 1) (T (+ (length (cdr list)) 1 )))
Ready
(length '(a b c))
3
Ready
(length ())
0
Ready
(length '(a (b c ) d e (f g)))
5
Ready
(length '(a : b))
2
Ready

正しく動いているようです。


2. 階乗を求める

入力した数の階乗を求めるプログラムを作ってみましょう。

(define (factor n)
        (cond
                ((<= n 0) 1)
                (T (* n (factor (- n 1))))
        )
)

これも簡単ですね。

引数nが0以下なら1を返します。これは、本来は変なのですが、誤って負やゼロが入力されてしまっても対応できるようにこうしてます。

そうでなければ、引数nに、n-1を再帰的に自分自身を呼び出した関数の返り値を掛け合わせます。

入力するときには、例によって、1行にまとめなければならないため、改行やタブをとります。

(define (factor n) (cond ((<= n 0) 1)(T (* n (factor (- n 1)))) ))

実行してみましょう。

$ descartes -u lisp-utf8
Descartes Lisp/λ (c) 2010 H.Niwa
Ready
(define (factor n) (cond ((<= n 0) 1)(T (* n (factor (- n 1)))) ))
(λ (n) (cond ((<= n 0) 1) (T (* n (factor (- n 1))))))
Ready
(factor 1)
1
Ready
(factor 3)
6
Ready
(factor 10)
3628800
Ready
(factor 5)
120
Ready