0

#xRacket に基づいて新しい言語を作成していますが、構文-quote などの特定のマクロを機能させたくありません#'#'構文の引用を行わないように削除するにはどうすればよいですか?

次のようにして、単一文字のマクロでそれを行うことができます

(make-readtable (current-readtable)
                #\' #\a #f) ; set ' to be the same as a normal character

しかし、ディスパッチ マクロに対してこれを行う方法がわかりません。

4

1 に答える 1

0

#'あなたが次のように扱われたいと仮定します'

reader-proc通常の を単に呼び出す を提供しread-syntaxます。

#lang racket/base

(define (reader-proc ch in src line col pos)
  (read-syntax src in))

(define our-readtable (make-readtable (current-readtable)
                                      #\'
                                      'dispatch-macro
                                      reader-proc))

;; A `#:wrapper1` for `syntax/module-reader`, i.e. to use in your
;; lang/reader.rkt
(define (wrapper1 thk)
  (parameterize ([current-readtable our-readtable])
    (thk)))
(provide wrapper1)

;; tests
(module+ test
  (require rackunit
           racket/port)
  (parameterize ([current-readtable our-readtable])
    (check-equal? (with-input-from-string "#'foo" read)
                  'foo)
    (check-equal? (with-input-from-string "#'(foo)" read)
                  '(foo))
    (check-equal? (with-input-from-string "#'(foo #'(bar))" read)
                  '(foo (bar)))))

少し複雑な作業の例'dispatch-macroは、最近追加したラムダ リーダー リテラル サポート#lang rackjureです。


更新しました

#'読み取りエラーを発生させたいと仮定すると、次のようになります"bad syntax: #'"

#lang racket/base

(require syntax/readerr)

(define (reader-proc ch in src line col pos)
  (raise-read-error (format "bad syntax: #~a" ch)
                    src line col pos 2))

(define our-readtable (make-readtable (current-readtable)
                                      #\'
                                      'dispatch-macro
                                      reader-proc))

;; A `#:wrapper1` for `syntax/module-reader`, i.e. to use in your
;; lang/reader.rkt
(define (wrapper1 thk)
  (parameterize ([current-readtable our-readtable])
    (thk)))
(provide wrapper1)

;; tests
(module+ test
  (require rackunit
           racket/port)
  (parameterize ([current-readtable our-readtable])
    (check-exn exn:fail? (λ () (with-input-from-string "#'foo" read)))))
于 2014-03-12T14:02:24.877 に答える