Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-06-24

オリジナルのSchemeインタープリタを動かそう

| 00:31 | オリジナルのSchemeインタープリタを動かそう - わだばLisperになる を含むブックマーク はてなブックマーク - オリジナルのSchemeインタープリタを動かそう - わだばLisperになる

Accesscom.com | SF Bay Area Internet Access Providerさんのページを眺めていたら、最初のSchemeの論文のインタープリタをCLに移植した(オリジナルはMacLISP)という面白そうなものがあったので早速試してみることにしました。

ここのlambda papersのリンクからファイルを取得できます。

このファイルをコンパイルして読み込ませたイメージをSBCLを使って実行ファイルにしてみました。

(compile-file "/tmp/scheme")
(load "/tmp/scheme")

(defun scheme-repl ()
  (handler-case (scheme)
    (error (cond)
      (declare (ignore cond))
      (format t "An error occurred.")
      (scheme-repl))))

(pushnew (lambda ()
           (scheme-repl))
         sb-ext:*init-hooks*)

(sb-ext:save-lisp-and-die "/tmp/scheme-1975" :purify 'T :executable 'T)

というようなファイルをmake-scheme.lispとでも名前を付けて、配布物の中のscheme.lispを/tmpに置いて、

$ sbcl --load make-scheme

と実行しすると、/tmp/にscheme-1975ができます。

実行可能ファイルになってますので、実行するとschemeのインタープリタが起動します。

そのままでは、エラー時にデバッガに落ちて面倒なので、適当に再度実行するようにしてありますが、もっとちゃんとした対処方法があると思います。

This is SCHEME 0 running in SBCL 1.0.17
SCHEME -- Toplevel

(define fact-iter
  (lambda (n)
    (labels ((fact1 (lambda (m ans)
                      (if (= m 0)
                          ans
                          (fact1 (- m 1)
                                 (* m ans))))))
      (fact1 n 1))))
==> 
FACT-ITER 
==> 
3628800 
==> 

まとめ/その他

にオリジナルのSchemeの論文があります。

また、EMACSで、(run-scheme "/tmp/scheme-1975")とすれば、EMACS経由で使えます。(quit)で終了。

どうも、doマクロ等がちゃんと動いてない気もするのですが、その辺をデバッグするのも一興ではないでしょうか(*'-')

2007-01-02

勉強するよ.25

| 22:00 | 勉強するよ.25 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.25 - わだばLisperになる

紫藤さんのもうひとつの Scheme 入門の実習をすることの3回目

今回は、 3. リストを作ろう に挑戦

例によって練習問題をやってみるだけだったり。


;;  練習問題 1
;; 処理系が次のように表示するデータ構造を cons で作ってください。

;;    1. ("hi" . "everybody")
(cons "hi" "everybody")

;;    2. (0)
(cons 0 '())

;;    3. (1 10 . 100)
(cons 1 (cons 10 100))

;;    4. (1 10 100)
(cons 1 (cons 10 (cons 100 '())))

;;    5. (#\I "saw" 3 "girls")
(cons #\I (cons "saw" (cons 3 (cons "girls" '()))))

;;    6. ("Sum of" (1 2 3 4) "is" 10) 
(cons "Sum of" (cons '(1 2 3 4) (cons "is" (cons 10 '()))))


;;  練習問題 2
;; 次の値を求めてください。

;;    1. (car '(0))
0

;;    2. (cdr '(0))
()

;;    3. (car '((1 2 3) (4 5 6)))
(1 2 3)

;;    4. (cdr '(1 2 3 . 4))
(2 3 . 4)

;;    5. (cdr (cons 3 (cons 2 (cons 1 '())))) 
(2 1)

2006-12-16

勉強するよ.24

| 23:48 | 勉強するよ.24 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.24 - わだばLisperになる

紫藤さんの

もうひとつの Scheme 入門の実習をすることの2回目

前回から大分時間が空いてしまった。

今回は、 2. Scheme を電卓代わりに使う

練習問題があるので、アタック。

;;; 練習問題 1
; 次の値を Scheme の処理系を用いて計算してください。
; (1+39) * (53-45)
(* (+ 1 39) (- 53 45))
; 320

; (1020 / 39) + (45 * 2)
(+ (/ 1020 39) (* 45 2))
; 1510/13

; 39, 48, 72, 23, 91 の合計
(+ 39 48 72 23 91)
;273

; 39, 48, 72, 23, 91 の平均を小数で。 
(exact->inexact (/ (+ 39 48 72 23 91) 5))
;54.6

;;; 練習問題 2
; 次の値を Scheme の処理系を用いて求めてください。

;  円周率 π
; マチンの公式
(* 4 (- (* 4 (atan (/ 1 5))) (atan (/ 1 239))))
;3.1415926535897936

;オイラーの公式
(* 4 (+ (* 5 (atan (/ 1 7))) (* 2 (atan (/ 3 79)))))

;(* 4 (atan 1.0))
;が正解とのこと、そもそもアークタンジェントが何な
;のか分かっていないため、Wikipediaで円周率の公式を
;探して回答してみた。

; exp(2/3)
(exp (/ 2 3))
;1.9477340410546757

; 3 の 4 乗
(expt 3 4)
;81

; 1000 の自然対数 
(log 1000)
;6.907755278982137

という感じ。

2006-11-26

勉強するよ.23

| 22:50 | 勉強するよ.23 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.23 - わだばLisperになる

今回から紫藤さんの

もうひとつの Scheme 入門を実習し

てSchemeの勉強をすることにしたのだった。

今回は、1. Scheme 処理系のインストール

今回もGaucheを使おうと思っているが、折角なので、処

理系を色々インストールしてみたいなと。

あと、このウェブサーバが動いている、Debian Linux/ARM Sageで、

goshがSegmentation faultで落ちてしまい、Wilikiも動かなくなっ

てしまっているので、良い機会ということで、自前でビルドとかし

つつ、直ったら良いねとか期待してみる。

とりあえず、Gaucheの最新版は、0.8.8になっているので、ソース

を取ってくる。

Wilikiを動かしたいので、Wilikiとgdbmも取ってくる。

gdbmをビルドする。

Gaucheをビルドする。

とりあえず普通にconfigure && make → とりあえず良し

make check →

Testing uniform vector and array ... failed.

discrepancies found. Errors are:

test f32vector-dot(#f32(32767 32767 32767 32767 32767), #f32(32767 32767 32767 32767 32767)): expects 5.368381445e9 => got 5.36838144e9

test f32vector-dot(#f32(214748368 214748368 214748368 214748368 214748368), #f32(214748368 214748368 214748368 214748368 214748368)):

test f32vector-dot(#f32(32767 -32767 32767 -32767 32767), #f32(32767 -32767 32767 -32767 32767)): expects 5.368381445e9 => got 5.36838144e9

ということでこのテストだけ失敗。

WilikiのARM-Linuxの情報によれば、最適化を外せばmake check

は通るのかもしれない。

根性無しなので、深追いせず、これで良しとする。

起動をテスト → 問題なす。

できた!


この後、Wlilikiをインストール。

◆◆ 関係ないけど、Wilikiの巻

Wilikiをまた動かすにあたって謎の現象に遭遇したので、書き留め

てみる。

普通の文章で書くとややこしくなってしまうので、箇条書にしてみ

た。

以前Linux/x86でWilikiを動かしていた。

データは、gdbm形式だった。

Solaris/Sparc(ビッグエンディアン)にしたら以前のデータが使え

なくなって困った。

→放置した。

MacOSX/PowerPC(ビッグエンディアン)でも、やっぱり使えなかった。

→放置した。

ふと今日 file wikidata.dbmしてみた。

→wikidata.dbm: GNU dbm 1.x or ndbm database, little endian

え、もしかして、エンディアンとか関係あるのかしら、と気付いた。

MacOSX/PowerPCのWilikiのデータを見てみた。

→やっぱり、ビックエンディアンでした。

ああ、エンディアンの問題だったか、ARMはどっちも切り換えられ

るらしいけど、Debianに限っては、リトルエンディアンらしいので、

x86のデータも大丈夫よねと、読ませてみた。

→駄目。

ここまで、NFSサーバ上のデータでテストしていた。

NFSサーバは、Linux/PowerPC故にビッグエンディアンマシン

MacOSX/PowerPCでは、問題なし。

Linux/ARM(リトルエンディアン)では、問題あり。

もしや、ということでデータをローカル上にコピーしそれを読ませ

てみた。

→成功

うぎゃぁぁぁ。

NFSってホストのエンディアンに影響されるの?

それとも自分の設定が駄目駄目なのかしら。

謎のまま終わる◆◆

2006-11-19

勉強するよ.22

| 15:48 | 勉強するよ.22 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.22 - わだばLisperになる

Schemeの勉強.21

独習 Scheme 三週間 17章のつづき

make-tableとか、どっから来たのか良く分からないのが

面倒で放置していた17.3と17.4章。

Gaucheで、この章に出てくるmake-tableの代わりになる

ものはないのかしらんと調べてみたら、案外すぐにみつ

かった。

make-hash-tableと、hash-table-get、hash-table-put!

を使えば良いらしい。Gaucheだと

(define table-get hash-table-get)
(define table-put! hash-table-put!)

(define *form-data-table* (make-hash-table 'string=?))

のような感じかしらん。

Gaucheでのハッシュテーブルの作成はGaucheプログラミ

ングのテーブルの作成を参考に。

この章はなんとなくまとまっていなくて、17.4のCGI電

卓を作るにあたって、17.3で定義されているcgi.scmだ

けを使えば良いのかといえば、そうでもなく、17.2章で

定義されているsplitとか、string-indexとかもcgi.scm

に含める必要がある。まあ、大したことではないのだけ

れど。

;; ;; ;; ;; ;; (* (+ 1 2 3) 4)

=> 24

とか動かしてみる。

とりあえず良しとして、「独習 Scheme 三週間」のはこ

れにて終り。

次は、紫藤さんの「もうひとつの Scheme 入門」を実習

することにした。

この入門ページの目的として、

>SICP を読める程度の Scheme の知識を提供することです。

とあるので、次の次には、SICPをちまちま実習してみた

い。

SICPは自分には難し過ぎるけど、適当に関連する数学の

勉強もしつつて寄り道しながら学習を続けてゆくのも面

白いだろうと思う。

2006-11-12

勉強するよ.20

| 17:33 | 勉強するよ.20 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.20 - わだばLisperになる

Schemeの勉強.20

独習 Scheme 三週間 Teach Yourself Scheme in Fixnum Days

ぼけっとしていたら、大分間があいてしまった。

秋ですなあ…。ぼーっとしてしまう。

今回も17章 CGIスクリプトで17.3 CGI スクリプトユー

ティリティ。

前回から間があいてしまったのは、とりあえず実行して

動作を確かめていたんだけども、そのなかで読み込む

table.scmが、どっから来たのか謎で、make-tableとか、

table-getとか、table-put!とかがどっから来たのか、

と悩んでいたためで、これは、この関数を作るのが勉強

なのかしら?とか思いつつ、放置。

これではいけないと、とりあえず、分かりそうなところ

だけでも読んでみた。

2006-10-21

勉強するよ.19

| 01:12 | 勉強するよ.19 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.19 - わだばLisperになる

Schemeの勉強.19

今日も17章 CGIスクリプト

17.2 例: 選択された環境変数の表示

今回も、(define getenv sys-getenv)の様に差異を吸収

だけで、例題をそのまま実行可能

2006-10-19

勉強するよ.18

| 23:51 | 勉強するよ.18 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.18 - わだばLisperになる

Schemeの勉強.18

独習 Scheme 三週間 Teach Yourself Scheme in Fixnum Days

今日は最終章である17章 CGIスクリプト。

長いので分割して実習してみる。

今回もGaucheでの実習の為、適宜書き換えてみたり、と

いっても今回は、getenv→sys-getenvとするだけ。

17.1 例: 環境変数の表示

#!/usr/bin/env gosh

;content-type がプレーンテキストであることを確認

(display "content-type: text/plain") (newline)
(newline)

;要求された情報を含むページを生成
;これは単に標準出力に書き出すだけ

(for-each
 (lambda (env-var)
   (display env-var)
   (display " = ")
   (display (or (sys-getenv env-var) ""))
   (newline))
 '("AUTH_TYPE"
   "CONTENT_LENGTH"
   "CONTENT_TYPE"
   "DOCUMENT_ROOT"
   "GATEWAY_INTERFACE"
   "HTTP_ACCEPT"
   "HTTP_REFERER" ; [sic]
   "HTTP_USER_AGENT"
   "PATH_INFO"
   "PATH_TRANSLATED"
   "QUERY_STRING"
   "REMOTE_ADDR"
   "REMOTE_HOST"
   "REMOTE_IDENT"
   "REMOTE_USER"
   "REQUEST_METHOD"
   "SCRIPT_NAME"
   "SERVER_NAME"
   "SERVER_PORT"
   "SERVER_PROTOCOL"
   "SERVER_SOFTWARE"))

2006-10-14

勉強するよ.17

| 18:23 | 勉強するよ.17 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.17 - わだばLisperになる

Schemeの勉強.17

独習 Scheme 三週間 Teach Yourself Scheme in Fixnum Days

今日は、第16章シェルスクリプト

主にというか、UNIXのシェルスクリプトとして動かして

みようってわけらしい。

Gaucheの場合、スクリプトの内容にmainを定義すること

によって、そのmainを呼ぶことで実行する仕組があるよ

うで、詳細は、

Gauche ユーザリファレンス: 3.3 Schemeスクリプトを書くを参照。

ということで、

#!/usr/bin/env gosh

(define (main args)
  (begin 	
    (display "Hello, World!") 
    (newline)))
#!/usr/bin/env gosh

(define (main args) 
  (let ((argv-count (length args)))
    (let loop ((i 1))			;$1 ...
      (unless (>= i argv-count)
	      (display (list-ref args i))
	      (newline)
	      (loop (+ i 1))))))
#!/usr/bin/env gosh

;; floppy-size = 3.5インチフロッピィにおさまるバイト数
(define floppy-size 1440000)

;; split は大きなファイル f をフロッピィの容量サイズの小さいサブファイルに
;; subfile-prefix.1、subfile-prefix.2 などに分割する。
(define split
  (lambda (f subfile-prefix)
    (call-with-input-file f
      (lambda (i)
        (let loop ((n 1))
          (if (copy-to-floppy-sized-subfile i subfile-prefix n)
              (loop (+ n 1))))))))

;; copy-to-floppy-sized-subfile は次の 1.44M Byte (のこりがこれよりも
;; 少ければ、全部)をその大きいファイルから n 番目のサブファイルに
;; コピーする。まだ、残っていれば真を返し、さもなければ、偽を返す。
(define copy-to-floppy-sized-subfile
  (lambda (i subfile-prefix n)
    (let ((nth-subfile (string-append subfile-prefix "."
                                      (number->string n))))
      (if (file-exists? nth-subfile) (sys-remove nth-subfile))
      (call-with-output-file nth-subfile
        (lambda (o)
          (let loop ((k 1))
            (let ((c (read-char i)))
              (cond ((eof-object? c) #f)
                    (else
                     (write-char c o)
                     (if (< k floppy-size)
                         (loop (+ k 1))
                         #t))))))))))

(define (main args)
  ;; bigfile = スクリプトの第一引数= 分割する必要のあるファイル
  ;; subfile-prefix = スクリプトの第二引数 = サブファイルのベース名
  (let ((bigfile (list-ref args 1))	
	(subfile-prefix (list-ref args 2)))
    ;; split を呼び、subfile-prefix.{1,2,3,...} を bigfile から生成する。
    (split bigfile subfile-prefix)))

と書き直してみる。

2006-10-03

勉強するよ.16

| 21:49 | 勉強するよ.16 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.16 - わだばLisperになる

Schemeの勉強.16

今日は、第15章 エンジン

「エンジンは時分割プリエンプションに従う計算を表現す

るものです。」

とのことだけど、call/ccとかの応用例ってことかしら。

なんとなく、今迄の総合的な応用っぽいね。

ということで、全体をざーっと眺めて、ふーんって言っ

て終える。

他所の教材も色々眺めて、また帰ってくる場所って感じ

かなと。

2006-10-01

勉強するよ.15

| 00:26 | 勉強するよ.15 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.15 - わだばLisperになる

Schemeの勉強.15

今日は、第14章でambオペレータで非決定性、バックトラッ

クとか。

バックトラックといえば、Plologとかも触ってみたいな

とも思ったりする。

前に コワルスキの『論理による問題の解法=Prolog入門』

を途中まで読んで挫折したが…。

ambの解説に関しては、SICP等参照とのこと。

ここまで来ると、入門って感じでもないので、まあ、何

となく、こういうのもあるんだなという程度に押える。

もうひとつの Scheme 入門の非決定性が分かりやすい解

説で参考になる。

2006-09-28

勉強するよ.14

| 21:18 | 勉強するよ.14 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.14 - わだばLisperになる

Schemeの勉強.14

今日は、第13章でジャンプの巻

call-with-current-continuationを使ったループからの

脱出とか、継続を保存して、再開とか。

なんでも良いけど、例題が難しい。

Schemeの世界はこういうの多いけども。

継続を自由に扱えるってのは、SchemeのSchemeらしいと

ころだけども、良く継続は難しい概念という風に説明さ

れてて、自分も最初は何だか良く分からなかった。

しかし、SchemeとActor理論という良くできたActor理論

の解説ページを読んで、何となく理解できたのだった。

世の中の継続の解説ページは、大域脱出、CPS、末尾再

帰、等がごちゃごちゃになってることが多いので、混乱

してしまう。

そんな時には、Actor理論だけ押えとけば、すっきり納

得できるんじゃないだろうかと思わなくもない。

そしてプログラム言語に限らず、継続っていう概念は、

人間の普段の生活にも沢山現れる気がする。

例えば、牛乳パック。コンビニに並んでいる牛乳パック

には沢山の継続が含まれている。最低でも、「最終的に

は燃えるごみになる」という継続が含まれていると思う

、そんな秋。

2006-09-27

勉強するよ.13

| 21:47 | 勉強するよ.13 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.13 - わだばLisperになる

Schemeの勉強.13

今日も、第12章の途中

うーん、この章で行っていることは、自前のオジェクトシステムを

構築しつつ、その仕組も一緒に学習しよう、ということなのか。

Gaucheにはオジェクトシステムがあるので、内容をそれで書き直し

てみれば良いのだろうか。

っていうか、MzScheme使って実習しろよ、ということになってしま

うのか。

いや、しかし、MzSchemeを使ってみたとしても、説明が濃縮され過

ぎていて良く分かんないから一緒かもしれない。

とりあえず、Gaucheで書いてみたが、例題の意図を汲み取れていな

いので、何がなんだか分からない模様に。

別々にしちゃったけど、クラスの中でメソッドが定義されているの

が醍醐味であり、別々に分けちゃいけないのかしら。

;; 12.1
;; クラスを定義
(define-class trivial-bike-class ()
  ((frame :init-keyword :frame)
   (size :init-keyword :size)
   (parts :init-keyword :parts)))

;; 確認
;(d trivial-bike-class)

;; インスタンスを作成
(define my-bike
  (make trivial-bike-class
    :frame 'cromoly
    :size '18.5
    :parts 'alivio))

;(d my-bike)
;=> gosh> (d my-bike)
;   #<trivial-bike-class 0x815f750> is 
;    an instance of class trivial-bike-class
;   slots:
;     frame     : cromoly
;     nsize      : 18.5
;    parts     : alivio


;; メソッドを含むクラス ってのが良く分からないというか、何が
;; どうなってるのか良く分からない。
;; define-classとdefine-methodで作ってみた。

;; クラスを定義
(define-class bike-class ()
  ((frame :init-keyword :frame :accessor frame-of)
   (size :init-keyword :size :accessor size-of)
   (parts :init-keyword :parts :accessor parts-of)
   (chain :init-keyword :chain :accessor chain-of)
   (tires :init-keyword :tires :accessor tires-of)))

;; 確認
;(d bike-class)

;; インスタンスの作成
(define my-bike
  (make bike-class
    :frame 'titanium ; I wish
    :size 21
    :parts 'ultegra
    :chain 'sachs
    :tires 'continental))

;; 確認
; gosh> (d my-bike)
; #<bike-class 0x81713d0> is an instance of class bike-class
; slots:
;   frame     : titanium
;   size      : 21
;   parts     : ultegra
;   chain     : sachs
;   tires     : continental

;(size-of my-bike)
;=> 21

;; メソッドを定義
(define-method check-fit ((me bike-class) inseam)
  (let ((bike-size (size-of me))
	(ideal-size (* inseam 3/5)))
    (let ((diff (- bike-size ideal-size)))
      (cond ((<= -1 diff 1) 'perfect-fit)
	    ((<= -2 diff 2) 'fits-well)
	    ((< diff -2) 'too-small)
	    ((> diff 2) 'too-big)))))

; gosh> (check-fit my-bike 32)
; =>fits-well

2006-09-24

勉強するよ.12

| 12:53 | 勉強するよ.12 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.12 - わだばLisperになる

Schemeの勉強.12

今日は、第12章の途中

オブジェクトとクラスの章だけども、いきなり難しいと

いうか、プログラム言語初学者対象って感じじゃなくなっ

てしまってる香り。

Gaucheを使って学習する場合、CLOSっぽいGaucheのオジェ

クトシステムがあるので、それと比較しながら学習する

のが良いのだろうが、自分は、MzScheme、Gauche、オジェ

クト指向、それぞれが良く分かっていないので、何をす

べきかが全然見えてこない。が、しかし、適当に進むこ

とにはしてみよう。

とりあえず、例示コードのの適当な書き直し。

(define-class standard-class ()
  ((slots :init-keyword :equ)
   (superclass :init-keyword :superclass)
   (method-names :init-keyword :method-names)
   (method-vector :init-keyword :method-vector)))

(define trivial-bike-class
  (make standard-class
    :superclass #t
    :slots '(frame parts size)
    :method-names '()
    :method-vector #()))

12章の巻は、まだ続く。

2006-09-19

勉強するよ.11

| 23:02 | 勉強するよ.11 - わだばLisperになる を含むブックマーク はてなブックマーク - 勉強するよ.11 - わだばLisperになる

Schemeの勉強.11

今日は、第11章終了。

今日は、システムインターフェース近辺を学ぶ。

結構処理系依存な香りで、

Gaucheだと、

(file-exists? "/tmp/foo")

(define delete-file sys-remove)

(define system sys-system)

(use file.util)
(define file-or-directory-modify-seconds file-mtime)

(define getenv sys-getenv)

みたいな感じかなと。