読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

疑似ハッシュ

ハッシュのようにアクセスできるけどコンパイル(マクロ展開)時にvectorのインデックスに置き換えられるようにする。

(define-macro
  (let-pseudo-hashtable accessor-name key&value . body)
  (let ((key-table (make-eq-hashtable))
        (value-vector (gensym)))
    (let loop ((lis (map car key&value)) (i 0))
      (if (pair? lis)
        (begin
          (hashtable-set! key-table (car lis) i)
          (loop (cdr lis) (+ i 1)))))
    `(let ((,value-vector (vector ,@(map cadr key&value))))
       (define-macro
         (,accessor-name key)
         `(vector-ref ,',value-vector ,(hashtable-ref ',key-table key #f)))
       ,@body)))


(let-pseudo-hashtable
  pseudo-hashtable-ref
  ((foo 1)
   (bar 2))
  (pseudo-hashtable-ref foo)) ; 1