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
中的代码仍然没有进行静态类型检查。

后续问题此处的后续问题: