Macros 使用禁用的dispatch reader宏创建可读表
我正在基于Racket创建一种新语言,我不希望某些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
#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是的,没错。我想为我的语言删除它的功能,就像我在引用字符示例中所做的那样。