Lisp

μSchemeR の Ruby による実装を読む(その4 - 再帰、純粋関数型言語の完成)

まずは if文を実装しましょう。書き方はこんな感じ。 [:if, [:>, 3, 2], 1, 0] まずは従来のメソッドを書き直します。(あとで :letrec も実装するので、それも書き加えています。) def special_form?(exp) lambda?(exp) or let?(exp) or letrec?(exp) or i…

μSchemeR の Ruby による実装を読む(その3 - クロージャ)

:lambda にクロージャを実装する前に、let文を実装します。 [:let, [[:x, 3], [:y, 2]], [:+, :x, :y]] は [[:lambda, [:x, :y], [:+, :x, :y]], 3, 2] と同等です。実装。単純です。:lambda に変換しているだけです。 def eval_let(exp, env) parameters, a…

μSchemeR の Ruby による実装を読む(その2 - 無名関数)

簡単な演算ができるようになったので、次に無名関数を実装してみます。具体的には、 [[:lambda, [:x, :y], [:+, :x, :y]], 3, 2] というような関数を評価することを考えます。これは Ruby でなら lambda do |x, y| x + y end.call(3, 2) みたいなものですね…

μSchemeR の Ruby による実装を読む(その1 - 簡単な演算)

つくって学ぶプログラミング言語 RubyによるScheme処理系の実装【電子書籍】渡辺昌寛達人出版会発行日: 2013-04-15対応フォーマット: PDF, EPUB詳細を見る言語処理系のお勉強をしようと思って調べてみたところ、上の文書を見つけました。Ruby で Scheme の一…

Scheme(Gauche)でフィボナッチ数列

こんな感じでしょうか。 (define (sub a b co n) (if (= co n) a (begin (print a) (sub (+ a b) a (+ co 1) n)))) (define (fibonatti n) (print (sub 1 1 1 n))) (fibonatti 10) Scheme って while 文も for 文もないのですね。繰り返しは do 文でやるか、…

Linux Mint(Ubuntu)でScheme(Gauche)を使う

先日 Scheme 処理系はとして Guile を入れてみたのですが、どうも Gauche の方がメジャーみたいですね。ということで入れてみました。 $ sudo apt-get install gaucheついでに $ sudo apt-get install rlwrapをしておくといいかも知れない。$ rlwrap gosh で…

Linux Mint(Ubuntu)で Guile(Scheme)を使う

Linux Mint 17.2 で確認しました。Guile は Scheme の実装のひとつです。処理系は「ソフトウェアの管理」で guile-2.0 と guile-2.0-dev を入れました。バージョンは多少古く、guile 2.0.9 が入ります。 $ guile で対話型インタプリタが起動します。 tomoki@…

Linux Mint で Common Lisp(SBCL)

インストールは「ソフトウェアの管理」から sbcl を選択するだけ。ただし、ヴァージョンは多少古くなるよう(今のところ SBCL 1.1.14)。 helloworld.lisp (write-line "Hello, World!") スクリプトとして実行できる。 $sbcl --script helloworld.lisp Hello…