2012年9月7日金曜日

Racket で R6RS を利用する

1. R5RS

Scheme の言語仕様には、R5RS と R6RS がある。

Scheme – Wikipedia によると、

… その仕様はRevisedn Report on the Algorithmic Language Scheme (RnRS)と呼ばれている。現在広く実装されているものは改訂第五版に当たるR5RS(1998年)であり、2007年にはR6RSが策定された。

Racket は、Scheme から派生した言語。R5RS でコードを書きたい場合、メニューより

  • Language > Choose Language > Choose a language > R5RS

を選択する。

SnapCrab_Choose Language_2012-9-7_21-25-0_No-00

 

2. R6RS

R6RS とは、Scheme – Wikipedia によると、

2007年9月に新仕様「The Revised6 Report on the Algorithmic Language Scheme (R6RS)」[5] が成立した。4部構成となり、R5RSに比べおよそ3倍の文章量となった。今までは小さな言語仕様に対してのこだわりが見られたが、Unicodeサポート等の実用的な言語として必要な要素が盛り込まれている点が特徴的である。

R6RS:概要と例 によると、

R6RS準拠のSchemeプログラムは、ひとつのトップレベルプログラムと、いくつかのライブラリから構成されます。

トップレベルプログラムはSchemeプログラムの実行が開始されるコードです。先頭で必要とするライブラリをimportして、後はR5RSまでと同じように定義や式を並べておきます。定義と式はどのような順序で現れても構いません。上から順番に実行されます。

(import (rnrs)           ; R6RS baseと標準ライブラリをインポート
        (mylib mystuff)) ; (mylib mystuff)ライブラリをインポート

 

a. 言語の選択

Racket では、メニューより、

  • Language > Choose Language > Use the language declared in the source

を選択する。

SnapCrab_NoName_2012-9-7_22-40-46_No-00

R6RS: Scheme2 Running Top-Level Programs に、R6RS の利用方法が書かれている。

#!r6rs
(import (rnrs))
(display "hello\n")

1行目に、UNIX のスクリプトのように #! を記述をする。

シバン (Unix) – Wikipedia とは、

シバンまたはシェバン (shebang) とはUNIXスクリプト#!から始まる1行目のこと。起動してスクリプトを読み込むインタプリタを指定する。

 

b.新規ファイルを作成したときの自動入力

新規ファイルを作成したときに、1行目に自動的に #!r6rs を記述してほしい。

そのためには、メニューより、

  • Language > Choose Language > Use the language declared in the source

を指定した後、左下の Show Details ボタンを押し、Automatic #lang line に

#!r6rs

を入力しておく。

 

c.ライブラリの指定

1 Using R6RS with DrRacket には、複数のライブラリを指定する例が書かれている。

#!r6rs
(import (rnrs lists (6))
        (rnrs base (6))
        (rnrs io simple (6)))
(display (find even? '(3 1 4 1 5 9)))

読み込まれるライブラリは、5 Libraries and Collections によると、

(rnrs io simple (6))  means  (lib "rnrs/io/simple-6.rkt")
(rnrs)                means  (lib "rnrs/main-6.rkt")
(rnrs main)           means  (lib "rnrs/main_.rkt")
(rnrs (6))            means  (lib "rnrs/main-6.rkt")
(racket base)         means  (lib "racket/base.rkt")
(achtung!)            means  (lib "achtung%21/main.rkt")
(funco new-λ)         means  (lib "funco/new-%ce%bb.rkt")

ライブラリについて詳しくは、8 R6RS Libraries を参照。

 

d. #lang の意味

1行目の記述は、 R6RS Module Language によると、

The r6rs language is usually used in the form #!r6rs, which is equivalent to #lang r6rs and is also valid R6RS syntax.

#lang の意味は、6.2.2 The #lang Shorthand によると、

In the case of #lang racket, the syntax is

#lang racket

decl ...

which reads the same as

(module name racket

decl ...)

where name is derived from the name of the file that contains the #lang form.

 

3. Pretty Big

Legacy Languages として、R5RS と並んで Pretty Big がある。

2.2 Legacy Languages によると、

The PLT Pretty Big language provides a language roughly compatible with a language in earlier versions of DrRacket. It evaluates a program in the same way as load, and it starts by importing the following modules: mzscheme, racket/gui/base, mzlib/class, mzlib/etc, mzlib/file, mzlib/list, mzlib/unit, mzlib/include, mzlib/defmacro, mzlib/pretty, mzlib/string, mzlib/thread, mzlib/math, mzlib/match, and mzlib/shared.

 

関連サイト