【问题标题】:How to do define-for-syntax in typed racket?如何在打字球拍中定义语法?
【发布时间】:2021-04-01 04:44:52
【问题描述】:

这行得通

#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)))

每个都因某种原因而失败。难道typed/racket处理不了{begin|define}-for-syntax

【问题讨论】:

    标签: syntax macros racket typed


    【解决方案1】:
    #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,但是:是在阶段0被#lang typed/racket导入的,所以会报错:

    :: undefined
    

    然而,另一个主要问题是,即使您设法在第一阶段导入:,类型检查器仍然无法正常工作。

    简而言之,这里是你可以让它工作的方法。

    #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)))
    

    这在typed/racket 语言的子模块for-syntax-mod 中声明foo,因此类型检查器现在将按预期在此子模块上工作。然后我们在第一阶段导入这个子模块,所以现在foobegin-for-syntax 中可用。请注意,begin-for-syntax 中的代码仍然没有进行静态类型检查。

    【讨论】:

    猜你喜欢
    • 2014-04-29
    • 1970-01-01
    • 2022-12-19
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2013-09-08
    相关资源
    最近更新 更多