Scheme でやりたいこと

Scheme予約語がなかったり構文拡張ができたりするので、自分で言語をデザインできるのが魅力だ。

やりたいことをまとめておこう。

ジェネリック関数

length、string-length、vector-length を length に、write、write-char を write に統合。これはそんなに難しくないと思う。

構文拡張

Scheme は少ない基本構文を組み合わせてより複雑な構文を作成する、というポリシーを持っている。僕も C 言語の制御構文は if と goto の組み合わせですべて表現できるなと思った(要するにアセンブラだ)。

Scheme に for や while を持ち込むのは比較的簡単だと思うけど、僕は goto を持ち込みたい。継続でできるかな?

部分適用

初めて lambda を見たとき「これは Haskell で言うところの部分適用ができるのでは?」と思った。

(lambda (x y z)
  (+ x y z) 1 2 3)

これを

(define foo
  (lambda (x y z)
    (+ x y z)))

(define bar
  (foo 1))

(bar 2 3)

という感じで、foo に引数をひとつだけ渡した状態の bar という関数を作成し、その関数に第二、第三引数を渡して評価するという具合だ。残念ながら上記コードは動作しない。

delay や継続を使えば実現できるかな?

プリプロセッサ

C のプリプロセッサのような機能を実現してみたい。

(#if gauche)
; gauche 固有の処理
...
(#elif mzscheme)
; mzscheme 固有の処理
...
(#else)
; それ以外の処理系の処理
...
(#endif)

理想はこんな感じ。該当箇所以外は C のプリプロセッサ同様評価されない。Lisp の仕組みとして、分離された S 式の連動はできないので、この形は無理だろうと思うけど、考えてみたい。