在Racket中检测方言

时间:2018-01-19 14:19:01

标签: racket

我想编写适用于无类型球拍和打字/球拍的代码......

目前,我已经提出了以下不那么令人满意的原则:我在文件的开头插入了一个虚拟语法定义':',以便在使用无类型球拍时跳过注释。我在使用typed / racket时评论了这个定义。

E.g:

$text = 'my text';
findAll('xpath', "//*[contains(text(), '$text')]");

#lang racket
; comment the following line for typed/racket
(define-syntax : (syntax-rules () ((_ id type) (void))))
(: fact (-> Integer Integer))

; the rest of the file is common to both racket and typed/racket
(define (fact n) (if (zero? n) 1 (* n (fact (sub1 n)))))

这样我只需删除/插入';'在球拍和打字/球拍之间切换......

但是有没有办法让一个代码在球拍和打字/球拍中运行不需要任何改变?我没有找到如何以编程方式检测我是否在球拍或打字/球拍...然后我想我还必须找到一种方法在顶级有条件地定义':'所有这些都没有似乎还有什么路要走,那么,还有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

通常,如果您希望代码同时适用于#lang racket#lang typed/racket,只需在#lang typed/racket中编写代码即可。当您需要使用#lang typed/racket中编写的模块#lang racket编写的模块时,将自动在两个模块之间插入合同以强制执行类型。你不需要做任何特殊的事情来要求从无类型的模块中输入类型的模块,因此从用户的角度来看,他们不需要关心。

在编写宏时,您可能需要担心处于类型化或非类型化上下文的一个区域。通常,您可以在两种情况下扩展到相同的代码,但有时,您必须根据是否键入目标代码来执行不同的操作。为此,您可以使用define-typed/untyped-identifier,它允许指定在不同上下文中使用的两种不同形式。

如果确实需要检测当前的扩展上下文是否已键入,则可以使用大锤syntax-local-typed-context?。但是,文档本身建议避免使用它:

  

这是核选项,因为它有时候很少有用。避免。