読者です 読者をやめる 読者になる 読者になる

@uents blog

Code wins arguments.

SICP 読書ノート#2 - 1.1 名前と環境 (pp.1-4)

名前と環境

変数に名前をつける手段(関数とは書いていない)として define がある。原文を引用。

A critical aspect of a programming language is the means it provides for using names to refer to computational objects. We say that the name identifies a variable whose value is the object.

プログラム言語の重要な点は、名前を使って計算オブジェクトを指す手段を用意することである。 計算オブジェクトを値(value)とする変数(variable)を識別する手段が名前(name)である

変数と名前を明確に区別することが需要。Cのようは代入が当たり前の言語だとここから混乱しそう。(実際に僕が学生の頃はしていたと思う)

(define size 2)

とすると、解釈系は値2と名前sizeを対応づける(associate with)。

対応づけるとは何か? さらに以下の記述がある。

It should be clear that the possibility of associating values with symbols and later retrieving them means that the interpreter must maintain some sort of memory that keeps track of the name-object pairs. This memory is called the environment (more precisely the global environment, since we will see later that a computation may involve a number of different environments).

値と記号を対応づけ、後にそれが取り出せるためには、解釈系は名前とオブジェクトの対を 見失なわないための、何か記憶を保持していることに他ならないことは明らかである。 この記憶を環境(environment)という。 (より正確には、後になって計算は多くの異なる環境に関わるということが分かる故に 大域環境(global environment)という)

出ましたよ、環境。簡単に言えば、環境とは「名前とオブジェクトの対を保持するもの」 ということだと思う。

環境については以下がすごくわかりやすいので紹介しておきます。

となれば、define とは束縛(bind)を含む操作なのか?という点が気になる。

この辺りは、Gaucheのユーザーリファレンスに以下のように記載されている。

Special Form: define (variable . formals) body 

[R5RS] この形式はトップレベル (ローカルな束縛が無い状態) 
ローカルスコープがある状態とで別の意味を持ちます。
トップレベルでは、この形式は変数variableに対するグローバルな束縛を定義します。
最初の形式では、expressionが評価され、その結果が変数variableの値となります。

 (define x (+ 1 2))
 x  3
 (define y (lambda (a) (* a 2)))
 (y 8)  16

2番目の形式は手続きを定義するための構文的な修飾で、以下の形式と同じです。

 (define (name . args) body )
   (define name (lambda args body ))

このフォームがローカルスコープの中に現われた場合、ローカル変数の束縛となります。

(以下略..)

束縛は何かと言うと、変数に対応するメモリ領域を確保する操作のこと。

つまりdefineとは、新しく変数を環境に束縛して値を代入する操作を行っていることになる。

束縛と代入(破壊的代入)の違いは以下がわかりやすいと思う。(やっぱり図はわかりやすいです)

学生の頃から今までこの辺りの理解ですらあやふやだったような気がする。。恥ずかし。

まとめ

  • 変数とは、値を持つ計算オブジェクト
  • 名前とは、計算オブジェクトを識別するためのシンボル
  • 環境とは、計算オブジェクトと名前を対応を保持するもの
  • 束縛とは、環境の中で計算オブジェクトを生成し値を代入すること
  • 代入とは、計算オブジェクトのデータを書き替えること

疲れたので今日はこの辺りで。


※「SICP読書ノート」の目次はこちら