descartes-src (ソースパッケージ descartes-src-0.26.0.tar.gz) | 2012-09-09 20:57 |
descartes-win (Windows用バイナリパッケージ descartes-win-0.26.0.zip) | 2012-09-09 20:52 |
会話キャラクター: ツンデレ アプリケーション (会話キャラ:ツンデレ v1.0 for Windows) | 2010-04-29 13:41 |
会話キャラクター: 2人の女の子 ダブルキャラクター (会話キャラクター 2人の女の子 ダブルキャラクター 1.0 for Windows) | 2011-10-02 22:23 |
会話キャラクター: Eliza風英語版 (会話キャラ:Eliza風英語版 v1.0 for Windows) | 2010-05-11 01:06 |
会話キャラクター: 猫耳メイド アプリケーション (会話キャラ:猫耳メイド v1.0 for Windows) | 2010-04-27 21:15 |
会話キャラクター: イライザ風日本語版 (会話キャラ:イライザ風日本語版 v1.0 for Windows) | 2010-04-30 21:53 |
経済指標表示プログラム for Windows (経済指標表示プログラム V1.0) | 2011-08-18 22:04 |
ニュースヘッドライン表示プログラム (ニュースヘッドライン表示プログラム V1.0 for Windows) | 2011-08-16 12:31 |
デカルト言語 example (デカルト言語の例題 example-0.7.0.zip) | 2009-03-01 19:47 |
電力状況表示プログラム for Windows (2011年夏版 全国電力供給状況表示プログラム V1.0) | 2011-08-15 13:25 |
このLispは、とてもシンプルなLispですが、いろいろとLispらしいプログラムを書くこともできます。
簡単なプログラムをまず作ってみましょう。
リストの長さを求めるプログラムを作ってみましょう。
すべてのプログラムは、現在この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
正しく動いているようです。
入力した数の階乗を求めるプログラムを作ってみましょう。
(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
[PageInfo]
LastUpdate: 2010-05-03 00:52:48, ModifiedBy: hniwa
[License]
Creative Commons 2.1 Attribution
[Permissions]
view:all, edit:login users, delete/config:login users