Hatena::Grouphappyabc

基本的な構文

基本的な構文

目次

  • 概要
    • 文と式の違い
  • 字句要素
    • 識別子
  • リテラル
    • 整数[式]
    • 浮動小数[式]
    • 文字列[式]
    • 真偽値[式]
  • 複合データ
    • (lambda (arg1 arg2 ..) e1 e2 ..)[式]
    • (list e1 e2 ... en)[式]
    • (array e1 e2 ... en)[式]
  • 条件分岐
    • (if test cons alt)[式]
    • (cond clause1 clause2 ..)[式]
  • 変数束縛
    • var[式]
    • (let ((var1 init1) (var2 init2) ..) e1 e2 ..)[式]
    • (let ((var1 init1) (var2 init2) ..) e1 e2 ..)[式]
    • (define var body)[文]
    • (define (f arg1 arg2 ..) body)[文]

リファレンスマニュアル

概要

基本的な構文は、R5RSのサブセットになるように実装しています。

サブセットなので、全ての構文要素を使うことはできませんが、使える構文はR5RSと同じはずです。

文と式の違い

構文要素には、式と文があります。式と文の違いは以下の通りです。

  • 式は、文の代わりに使える
  • 文は、式の代わりに使えない
  • 文は、変数定義など、大域環境に影響を与える(ものが多い)

字句要素

識別子

識別子は、変数名などに用いられます。用いれる文字は以下の通りです。

先頭!%&*/:<=>?^_~+-*.
先頭以外先頭で使える文字に加えて、@

上記以外にも$が使えますが、$は処理系内部の実装用に予約されています。特別な事情がない限り使うべきではありません。

リテラル

リテラルは、全て式です。

整数[式]

整数は、以下の表記が可能です。

  • 10進数表記。例:42, -1
  • 16進数表記。例:0xdeadbeaf

浮動小数[式]

浮動少数は、-dd.ddd形式(例:12.3)形式のみ対応しています。

指数表記(例: 1.1e3)にた対応していません。

文字列[式]

文字列は、"で囲みます。以下のエスケープシーケンスにも対応しています。

\n改行文字
\tタブ文字
\""そのもの
\\\そのもの

真偽値[式]

真は#t、偽は#fです。

複合データ

(lambda (arg1 arg2 ..) e1 e2 ..)[式]

無名関数を定義します。

(list e1 e2 ... en)[式]

e1からenで構成されるリストを生成します。

リストを操作する関数は、標準ライブラリ?に定義されています。

(array e1 e2 ... en)[式]

e1からenで構成される配列を生成します。

配列を操作する関数は、まだ定義されていません。

条件分岐

(if test cons alt)[式]

testを評価し、真の場合ばconsが、偽の場合はaltが評価されます。

alt、いわゆるelse節を省略することはできません。

(cond clause1 clause2 ..)[式]

各節は以下の2つのうち、いずれかの形をしています。

  • (test e1 e2 ..)
  • (else e1 e2 ..)

後者は最後の節でのみ利用できます。

前から順にtestを評価していき、最初に真になった節のe1からenまでを評価します。

elseは常に真に評価されます。

変数束縛

var[式]

変数を参照します。

参照を探す順は、

  1. ローカルな束縛
  2. 現在のモジュール
  3. 親のモジュール
  4. さらに親のモジュール
  5. ...
  6. openされているモジュール

となっています。

またfoo.bar.xのようにモジュール名を明示的に指定することもできます。

モジュールシステムも参照してください。

(let ((var1 init1) (var2 init2) ..) e1 e2 ..)[式]

ローカルな束縛を生成します。

var1をinit1に、var2をinit2に、..、束縛した後、e1、e2、..を評価します。

init_nから束縛した変数を参照できません。

(let ((var1 init1) (var2 init2) ..) e1 e2 ..)[式]

ローカルな束縛を生成します。

var1をinit1に、var2をinit2に、..、束縛した後、e1、e2、..を評価します。

init_nから束縛した変数を参照できます。

(define var body)[文]

現在のモジュールにおいてvarをbodyに束縛します。

モジュールシステムも参照してください。

(define (f arg1 arg2 ..) body)[文]

(define f (lambda (arg1 arg2 ..) body))のシンタックスシュガーです。