require-extension
Felix L. Winkelmann, D.C. Frost
この SRFI では、Scheme のトップレベル環境に拡張機能やライブラリを 導入するための、極めてシンプルな仕組みを定義する。
プログラムを実行するために、 特定のフィーチャや拡張機能が必須であることを宣言する方法として、 「SRFI 7: フィーチャベースのプログラム設定言語」で定義されている (requires ...) 節がある。 この仕組みには、2つの制限がある。 第一に、SRFI 7 の実装は、 (requires ...) 節が現れたときに何かを行うことを要求してはいない。 本 SRFI を検討している時点では、 指定された拡張機能をロードして使用可能にするような実装もあるが、 そうなっていない実装もある。 第二に、SRFI 7 の設定言語は、 プログラム テキストに対する注釈としては適切であるが、 対話的に使用する用途には設計されていない。
そこでこの SRFI では、コンパイル時またはランタイム時に、 後続のコードが必要に応じて拡張機能をすぐに利用できるようにするための、 シンプルな仕組みを定義する。 プログラム内、または、対話的なセッションにおいて、 SRFI の機能をロードするための平凡で移植性のある方法を提供することを 設計目標としている。 しかし、ここで述べる仕組みは、SRFI 以外の他の拡張機能のためにも、 汎用的に使うことができる。
ほとんどの Scheme 処理系には、 require-extension に非常によく似たフォームがすでに存在している。 そのため、この SRFI は単に標準的な命名を定義するものであると捉えてもよい。
慣習に反することではあるが、実装上の設計が require-extension の意味論に反していることもあるだろう。 そのような実装では、 この SRFI の要件を満たすための別の方法を提供したほうがよいだろう。 この SRFI は普遍的であることを目的とはしておらず、 現在の慣例を取り入れているだけである。
require-extension フォームを使用すると、 そのフォームが存在するトップレベルのスコープで、 拡張機能が利用可能になる。 ここで言う「トップレベルのスコープ」(toplevel scope) という言葉の定義と、 「拡張機能が利用可能になる」という言葉の正確な意味は、 実装依存である。 しかし、ここで言う「スコープ」という言葉が、 プログラムの式が評価されるデフォルト スコープ、 モジュール内のプログラムの式が評価されるスコープ (このスコープはモジュール システムにより定義される)、 および、対話的な REPL ("read-eval-print loop") を含んでいることが望ましい。 非対話的なコンテキストで require-extension を使用して拡張機能を利用可能にした場合、 require-extension フォームより字句的に前に位置する同じスコープ内のコードにおいて、 その拡張機能が利用できるかどうかは、実装依存である。 しかし、require-extension フォームより字句的に後に位置する同じスコープ内のコードでは、 その拡張機能が利用できなくてはならない。 要求された拡張機能を利用可能にできない場合は、 警告やエラーを発生させるべきである。 ユーザーが互換性のない拡張機能を同時に要求した場合は、 警告やエラーを発生させることを推奨するが、これは必須ではない。
この SRFI をサポートしていると主張する実装系は、 少なくとも1つのスコープにおいて require-extension をサポートしなければならない。
require-extension の構文は以下のとおり:
(require-extension <clause> ...)
ここで clause は以下の形式をとるものとする:
(<extension-identifier> <extension-argument> ...)
ここで <extension-identifier> はシンボルであり、 <extension-argument> は 0 個以上の任意の Scheme 値である。
本 SRFI では extension-identifier としてただ1つの識別子 srfi を定義する。 本 SRFI に準拠していると主張する実装系は、 この識別子をサポートしなければならない。 srfi 節の extension-argument は、実装系に依存した任意の Scheme 値をとることができるが、 0 以上の整数値をサポートしなければならない。 0 以上の整数値が指定された場合、 その require-extension フォームが記述されているコンテキストにおいて、 その番号の SRFI の機能を利用可能にしなければならない。 たとえば:
(require-extension (srfi 1)) ; SRFI 1 リスト ライブラリを利用可能にする (require-extension (srfi 1 13 14)) ; SRFI 1, 13, 14 のライブラリを利用可能にする
require-extension の実装は、必然的に処理系固有の実装になる。
R5RS
の load オプション手続きを使用した
(非常にシンプルな) 実装例を以下に示す。
;;;; Reference implementation for SRFI-55 ; ; Requirements: SRFI-23 (error reporting) (define available-extensions '()) (define (register-extension id action . compare) (set! available-extensions (cons (list (if (pair? compare) (car compare) equal?) id action) available-extensions)) ) (define (find-extension id) (define (lookup exts) (if (null? exts) (error "extension not found - please contact your vendor" id) (let ((ext (car exts))) (if ((car ext) (cadr ext) id) ((caddr ext)) (lookup (cdr exts)) ) ) ) ) (lookup available-extensions) ) (define-syntax require-extension (syntax-rules (srfi) ((_ "internal" (srfi id ...)) (begin (find-extension '(srfi id) ...)) ) ((_ "internal" id) (find-extension 'id) ) ((_ clause ...) (begin (require-extension "internal" clause) ...)) ) ) ; Example of registering extensions: ; ; (register-extension '(srfi 1) (lambda () (load "/usr/local/lib/scheme/srfi-1.scm")))
Copyright (c) Felix L. Winkelmann and D.C. Frost (2004). All Rights Reserved.
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.