如何在`scribble / lp`中使用`typed / racket`

时间:2013-09-18 16:47:08

标签: racket literate-programming typed-racket scribble

是否可以使用#lang中的其他#lang scribble/lp进行文字编程?

例如,我想在#lang typed/racket中使用#lang scribble/lp。如何实现?

2 个答案:

答案 0 :(得分:1)

它不会出现,但你可以使用带有scribble / eval的打字/球拍评估器。

    #lang scribble/manual
    @(require racket/sandbox
              scribble/eval)
    @(define my-evaluator
       (parameterize ([sandbox-output 'string]
                      [sandbox-error-output 'string])
         (make-evaluator 'typed/racket/base)))
    @interaction[#:eval my-evaluator

                 (: my-sqr (Real -> Real))
                 (define (my-sqr x)
                   (* x x))
                 (my-sqr 42)]

取自here

的示例

答案 1 :(得分:0)

TL; DR:有两种方法。首先,您可以将代码放在子模块中,并立即要求它。其次,您可以使用my fork of scribble/lp2,它允许您指定基础模块语言。

第一种方法

由于an issue,您必须将整个内容包装在(begin …)中,尽管有一个拉取请求可以解决此问题。

#lang scribble/lp2

@chunk[<*>
       (begin
         (module main typed/racket
           (define a : Number 1)
           (provide a)
           (module moo racket/base '…)
           (module+ test
             (require typed/rackunit)
             (check-equal? a (+ 1/2 1/2))))

         (require 'main)
         (provide (all-from-out 'main))

         (module test typed/racket
           (require (submod ".." main test))))]

请记住这些是子模块,因此您无法将test模块放在main内,因为它不会被执行。在这里,我在(module+ test …)内有一个main,它是根级别的test模块所必需的。如果根目录中的(module test已注释掉,则不会执行测试。

同样的问题也适用于需要来自其他模块的moo时,您必须使用(require (submod "myfile.lp2.typed.rkt" main moo)),或者像test和{{上面所做的那样制作“别名” 1}}。

还要记住,子模块嵌套越多,访问和/或实例化的次数就越多(不确定哪个)。这会对打字/球拍程序中的加载速度产生严重影响,因为它们本身已经多次访问和/或实例化。您可以通过在代码中添加main来查看此内容,它会多次打印。

第二种方法

我的(begin-for-syntax (displayln 'executed))hyper-literate(用于超文本文字编程)只会改变scribble/lp2并依赖原始版本的scribble/lp2来完成剩下的工作。

我不保证向后兼容性,因为我正在修复一些错误并添加额外的功能,例如能够重新打印scribble以刷新读者的内存等。chunk我联系的分支应该保持稳定。较新的内容将放入master

这是一个小示例文件。有a more complete example in test/test.hl.rkt

stackoverflow-q-18877881