Macros 使用禁用的dispatch reader宏创建可读表

Macros 使用禁用的dispatch reader宏创建可读表,macros,racket,reader-macro,Macros,Racket,Reader Macro,我正在基于Racket创建一种新语言,我不希望某些#x宏工作,例如语法引号#'。如何删除它,使#“不执行语法引号,而是执行未绑定分派宏char所执行的任何操作 我可以用单字符宏通过 (make-readtable (current-readtable) #\' #\a #f) ; set ' to be the same as a normal character 但我不知道如何对分派宏执行此操作。假设您希望将#'视为,: #lang racket/base

我正在基于Racket创建一种新语言,我不希望某些
#x
宏工作,例如语法引号
#'
。如何删除它,使
#“
不执行语法引号,而是执行未绑定分派宏char所执行的任何操作

我可以用单字符宏通过

(make-readtable (current-readtable)
                #\' #\a #f) ; set ' to be the same as a normal character
但我不知道如何对分派宏执行此操作。

假设您希望将
#'
视为

#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)))))
提供一个只调用正常
读取语法的
读取器进程

#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
的一个稍微复杂一些的例子是to
#lang rackjure


已更新

假设希望
#'
导致读取错误,
“错误语法:#'”


不确定你想要的结果。您是否希望将
#'
视为
'
--例如
#'x
变为
'x
#(x)
变为
'(x)
?还是希望完全丢弃
#“
?或者别的什么?这与Scheme和CommonLisp有着同样多的关系。建议删除“Scheme”标记。@GregHendershott如我所说,“如何删除它,使
#”
不执行语法引号,而是执行未绑定分派宏字符所执行的操作?”即,I
#“
应该执行
#
#
所执行的操作(假设用户没有对它们进行编程),这是一个错误。
##
所做的就是给出一个错误:
“read:bad syntax`.#`.'
”。这就是你想要的吗?@GregHendershott是的,没错。我想为我的语言删除它的功能,就像我在引用字符示例中所做的那样。