Syntax 如何在键入的racket中定义语法?
这很有效Syntax 如何在键入的racket中定义语法?,syntax,macros,racket,typed,Syntax,Macros,Racket,Typed,这很有效 #lang racket (begin-for-syntax (define (foo n) (+ n 3))) 所以我也希望这能奏效 #lang typed/racket (: foo : Real -> Real) (define-for-syntax (foo n) (+ n 3)) 但是如果失败了 ; :: undefined; ; cannot reference an identifier before its definition 之后,
#lang racket
(begin-for-syntax
(define (foo n)
(+ n 3)))
所以我也希望这能奏效
#lang typed/racket
(: foo : Real -> Real)
(define-for-syntax (foo n)
(+ n 3))
但是如果失败了
; :: undefined;
; cannot reference an identifier before its definition
之后,我在typed/racket
(define-for-syntax (foo (n : Real)) : Real
(+ n 3))
(begin-for-syntax
(: foo (-> Real Real))
(define (foo n)
(+ n 3)))
(begin-for-syntax
(define (foo (n : Real)) : Real
(+ n 3)))
每一个都因为这样或那样的原因而失败。是否类型化/racket
无法处理{begin | define}-语法
#lang typed/racket
(: foo : Real -> Real)
(define-for-syntax (foo n)
(+ n 3))
在以下情况下失败:
Type Checker: Declaration for `foo' provided, but `foo' has no definition
对我来说,这完全有道理foo
在阶段1中定义,因此类型声明在阶段0中找不到其定义
(begin-for-syntax
(: foo (-> Real Real))
(define (foo n)
(+ n 3)))
更“正确”,但仍然有很多问题。代码处于第1阶段,但是:
是由#lang typed/racket
在第0阶段导入的,因此您会得到一个错误:
:: undefined
但是,另一个主要问题是,即使您在阶段1中成功导入了:
,类型检查器仍然无法正常工作
简而言之,以下是如何让它发挥作用
#lang typed/racket
(module for-syntax-mod typed/racket
(provide foo)
(: foo (-> Real Real))
(define (foo n)
(+ n 3)))
(require (for-syntax 'for-syntax-mod))
(begin-for-syntax (println (foo 10)))
这将在子模块
中声明foo
,用于语言类型化/racket
的语法mod
,因此类型检查器现在将按预期处理此子模块。然后我们在第1阶段导入此子模块,因此现在foo
在beginforsyntax
中可用。请注意,beginforsyntax
中的代码仍然没有进行静态类型检查。后续问题此处的后续问题: