独習 scheme 三週間 (1)

とりあえず GWT なナニは 1.3 が出てくるまで pending とゆーコトにする。正月休みは独習 scheme 三週間をきちんと読んでテキトーな理解の部分を明確にしつつ SICP 方面にツナげてみる、とゆー事で。

Chapter.1

Schemeに入力しよう
Hello, World なナニ。自宅環境には guile-1.6 が。ので、以下のナニは

hello.scm

(begin
  (display "Hello, World!")
  (newline))

コマンドプロンプトからは

$ guile -s hello.scm 
Hello, World!
$

みたいな感じで scheme のプロンプトからは

guile> (load "hello.scm")
Hello, World!
guile> 

とゆー感じですか。guile のオプションの -l と -s の意味の違いが微妙。

Chapter.2

データ型
いきなり R5RS を引いてしまうんですが 3.2 節にこんな記述あり。

以下の述語を複数同時に満足するオブジェクトは存在しない。
boolean? pair?
symbol? number?
char? string?
vector? port?
procedure?

R5RS より引用

で、参考資料では「単純データ型」と「合成データ型」という風に分けている模様。
あ、あと「述語」ですが、R5RS の 6.1 節で

述語 (predicate) とは常に真偽値 (#t あるいは #f) を返すプロシージャのことである。

R5RS より引用

という風に定義されている。scheme ではケツに ? を付けるのが慣習みたい。

で、真偽値ですが勘違いしかけた箇所をメモ。

(not "Hello, World!") => #f

最後の式はSchemeの便利なところで、真理値が必要な文脈では、 Schemeは#fではない値はすべて真の値として扱います。

独習 scheme 三週間より引用

guile> (boolean? "abc") 
#f
guile>

だけど (文字列なので boolean でないのは当たり前)

guile> (not "abc")
#f
guile>

_真偽値が必要な文脈_では #f 以外は #t として扱われるのか。

数値については略。文字もスルー。(いいのかなぁ) で、次のシンボルについては、ruby にもシンボルとゆーやつがあって、今ヒトツきちんと理解できてないんだよなぁ、と。(こら)

とりあえず理解しとく必要があるのは

Schemeによって変数と解釈されないシンボルを指定するにはシンボルをクウォートしなければなりません。

2.1.4 シンボル より引用

という部分ッスか。
R5RS によれば_バインドされていない変数を参照することはエラーである (R5RS の 4.1.1 より引用)_との事なので、リテラルを表現するために quote が必要なんだな、ってか初歩的スギで書いててだんだんヘコんできた。
あ、とりあえずメモっておきたいのは、以下の定数は quote 省略可能との事。

  • 数値定数
  • 文字列定数
  • 文字定数
  • 真偽値定数

2.2 以降は別途。(スルーの可能性大)

とりあえず、lambda をきちんと理解せんと。以下のような定義の手続きの呼び出しがソレ、とゆーのもまだナニなだけに。

guile> (define xxx (lambda (x) (lambda args (apply x args))))
guile> ((xxx +) 5 6 7)
18
guile>

あ、そか。xxx という手続きは手続きな引数を一つとって手続きを返すのか。なんか先走ってる感があるんで明日以降にしときます。