[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.10 定義

Special Form: define variable expression
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 …))

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

beginは新しいスコープを作らないことに注意してください(順次実行参照)。 beginの中に現われるdefineは、あたかもbeginとそれを囲む 括弧が無いかのように振舞います。すなわち、以下の2つの形式は等価です。

 
(let ((x 0))
  (begin
    (define (foo y) (+ x y)))
  (foo 3))
 ≡
(let ((x 0))
  (define (foo y) (+ x y))
  (foo 3))
Macro: define-values (var …) expr

まずexprが評価されます。それは与えられたvarと同数の値を 返さなければなりません。続いて各値がvarに順に束縛されます。 srfi-11 - Let-valuesも参照してください。

 
(define-values (lo hi) (min&max 3 -1 15 2))

lo ⇒ -1
hi ⇒ 15
Special Form: define-constant variable expression
Special Form: define-constant (variable . formals) body …

defineと同じように動作しますが、 コンパイラはvariableの値が今後変更されないものとして 最適化されたコードを生成します。

variableの値をset!で変更しようとするとエラーとなります。 variableを再定義することは許されますが、警告が表示されます。

Special Form: define-in-module module variable expression
Special Form: define-in-module module (variable . formals) body …

この形式はvariableのグローバルな束縛をmodule中に作成します。 moduleはモジュール名を表すシンボルか、モジュールオブジェクトで なければなりません。moduleがシンボルの場合、その名前を持つ モジュールが既に存在している必要があります。

expressionは現在のモジュール中で評価されます。

2番目の形式は次の形式の構文的修飾です。

 
(define-in-module module variable (lambda formals body …))

註: シンボルが現在のモジュール中で定義されているか(グローバルな束縛を持つか) を調べるには、global-variable-bound?が使えます (モジュールイントロスペクション参照)。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]

This document was generated by Shiro Kawai on May 28, 2012 using texi2html 1.82.