Scheme で定数定義

define がそろそろ長くて面倒になってきたので (遅いですか?)、こういうマクロを作ってみました。

(define-syntax set
  (syntax-rules ()
    ((set id x) (define id x))))

これならタイプするのも簡単です。

Racket であれば

(define-syntax set (make-rename-transformer #'define))

で define のエイリアスを作ることも可能なんですが、変数定義用の限定版ということで、上のでも良いかなと思います。

発展形として、set で導入された id を再定義できなくする方法も考えてみました。

(define-syntax set
  (syntax-rules ()
    ((set id e)
     (begin
       (define id~ e)
       (define-syntax id
         (syntax-id-rules (set!)
           ((set! id _) (error 'id "is not modifiable."))
           ((id . es) (id~ . es))
           (id id~)))))))
> (set x 1)
> x
1
> (set! x 2)
x: is not modifiable.

syntax-id-rules 便利!