1926


Schemeの最新仕様である R7RS の仕様が決まってから数年経過しますが、現在お勧めのR7RS処理系を教えてください。  
その処理系の

  1. R7RS仕様準拠度
  2. 特長

を教えてもらえると参考になります。


CC BY-SA 4.0
2014-12-16T08:50:08.973
1720
2019-05-25T21:03:38.377
2019-05-25T21:03:38.377
3510
3510
question
lisp scheme
おすすめのR7RS規格Scheme処理系は?


現時点で充分に R7RS の仕様を満たしていると私が認識しているのは以下の五つです。

  * Gauche
  * Sagittarius
  * Foment
  * Chibi
  * Picrin

それぞれについて私の感想を述べます。

## Gauche

人気のある処理系で、日本語のドキュメントがあるのがありがたいです。 スクリプト言語的な利用に便利な拡張も多く持っています。
作者自身が仕事に使っていることもあって、泥臭い現実的な用途にも使えるよう配慮しつつ、汚なくならないようにうまくバランスをとった実用的な処理系だと思います。

強いて言えばマクロ (syntax-rules)
に既知のバグが最初からあるのですが、次か更にその次あたりのリリースではマクロ展開器を根本的に書き直す計画があるようですし、多くの場合は簡単に迂回できるので問題にならないでしょう。

それと、元々が R5RS に独自拡張を足した処理系だったので、後からサポートした R7RS
としての部分と独自拡張の部分が少し統合しきれてないような印象を受けるのですが、実際の使い勝手を見ながら徐々に修正されるのではないでしょうか。

## Sagittarius

元々は R6RS 処理系でしたが、後から R7RS もサポートするようになりました。 R7RS のプログラムから R6RS
のライブラリを、またはその逆を利用可能というのが他にない大きな特徴です。
日常的に使いそうな便利なライブラリを多くもっており、作者自身が仕事上必要であることから暗号関係が充実している傾向にあるようです。

月に一度の定期リリース体制になっているので、たまにバグを見付けてもよほど難しい根本的なものでない限りは次のリリースに素早く修正が反映される安心感があります。

## Foment

私が使った感触としては R7RS 準拠度が特に高いように思うのですが SRFI のサポートは少ししかなく、独自の拡張もほとんどありません。
実用しようと思うと物足りないことが多いかもしれません。

## Chibi

事実上の参照実装という立場であることから R7RS 準拠度は高いと思います。 SRFI も広くサポートしており、堅実な処理系です。

Windows で動かすには Cygwin が必要というのがちょと面倒かもしれません。

## Picrin

アプリケーションに組込んで利用することを想定しており、組込んで使う部分をライブラリ Benz として別プロジェクトにして切り離しているという特徴があります。

Scheme 処理系としては比較的新しいこともあって開発状況が活発な印象を受けます。


CC BY-SA 3.0
2014-12-17T13:10:20.413
1926
2014-12-17T13:10:20.413
3364
1720
answer


Kawaも2.0から、JVMという環境上call/cc等サポートがほぼ不可能なものは除きますが、R7RSほぼ準拠しています。

製作者という立場から多少Sagittariusの特徴を以下に少し記述します。

SagittariusはR7RS-largeのサポートも積極的に行っていく予定です。現状で既にいくつかR7RS-
largeとして決定されたライブラリがサポートされています(SRFI-111等)。また、上記回答で挙げられたR7RS処理系の中で唯一FFIをSchemeから使うことが可能です(Gauche、Chibi及びPicrinはCでのバインディングを記述する必要があります)。
外部ライブラリ(外部に依存関係が必要になるもの)の開発が[Github](https://github.com/ktakashi)上で行われていて、以下のようなものがあります。

  * スマートカード通信ライブラリ
  * データベースアクセスライブラリ(Oracle、SQLite、PostgreSQL)

マルチプラットフォームで他の処理系に特に比べてWindowsのサポートが手厚いのも特徴です。ソース(tarボール)からのビルドに必要なものがCMakeとMSVC(2010以降でテスト)のみでかなり手軽にビルド可能です(その他の依存関係はビルドプロセスが自動で解決します)。


CC BY-SA 3.0
2014-12-19T10:05:08.580
2130
2014-12-19T10:05:08.580
5251
1720
answer


おすすめはGaucheです (ｷﾘｯ

…と言いきれるほど他の処理系を使っていないのですが、私の知る範囲でご質問にお答えしますと：

**R7RS準拠度**

現時点で最も大きな非互換性はキーワードオブジェクトです。R7RSではコロンで始まる名前は
シンボルですが、Gaucheではキーワードという特別な型になります。
近い将来、キーワードをシンボルのサブタイプとすることでR7RSの上位互換となる予定です。
(既にサポートコードは開発版に入っており、環境変数GAUCHE_KEYWORD_IS_SYMBOLがセットされていると 有効になります。)

他に、上で齊藤さんが挙げられているmacro defining macroや、 guardの例外ハンドラ節の末尾呼び出しがproper tail
callにならないなど既知の問題が少々あります。 また、R7RSサポート部分のコードは枯れてないので、ちょくちょくバグ報告も受けます。
後2～3リリースもすればかなり落ち着くと思いますが。

**特長**

GaucheはScheme標準をそのまま実装したものというよりは 「標準準拠で書かれたコード **も** 利用できる」Scheme+αの言語エンジン、
と考えていただく方が良いかもしれません。Gauche特有の機能の中には、 ポータブルなSchemeコードとしての実現が難しいものがあります。
例えば通常のリストと統合された遅延シーケンスは、 プログラムの書き方自体が変わってしまうほど影響の大きな機能ですが、
遅延シーケンスを当てにして書かれたGaucheコードを他のScheme処理系に 移植するのは不可能でないとしても大仕事となります。
(詳しくはマニュアルの[遅延シーケンス](http://practical-
scheme.net/gauche/man/?l=jp&p=%E9%81%85%E5%BB%B6%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9)を参照してください)

もちろんR7RS処理系のひとつとしてR7RS＋便利ライブラリとして使って頂いても 良いのですが、一旦Gaucheどっぷりのプログラミングに浸かってしまうと
規律正しいSchemeの世界に戻れないかもしれません。You've been warned.

それから、しばしば要望を頂いていた、「単独で実行可能なバイナリを生成する機能」について、 現在開発を進めています。
リリースできれば、Schemeでアプリを書いて配布するのが簡単になるかもしれません。


CC BY-SA 3.0
2014-12-19T12:26:07.830
2147
2014-12-19T12:26:07.830
5258
1720
answer