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

5

在文学式编程中,是否可以使用其他#lang?

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

2个回答

2
TL;DR: 有两种方法。首先,您可以将代码简单地放在子模块中,并立即要求它。其次,您可以使用 我的 fork 版本的 scribble/lp2,它允许您指定底层模块语言。

第一种方法

由于一个问题,您需要将整个内容包装在(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中,因为它不会被执行。在这里,我在main中有一个(module+ test …),并且它被一个根级别的test模块所需。如果在根目录中注释掉(module test,则测试将不会被执行。
当从另一个模块中要求moo时,同样也需要注意,您必须使用(require (submod "myfile.lp2.typed.rkt" main moo)),或者像上面为testmain所做的那样创建一个“别名”。
还要记住,子模块嵌套得越深,就会被访问和/或实例化更多次(不确定哪种情况)。这可能会对类型化/ racket程序的加载速度产生严重影响,因为它们本身已经被访问和/或实例化多次。您可以通过在代码中添加(begin-for-syntax (displayln 'executed))来查看这一点,它会被打印多次。
第二种方法
我对 `scribble/lp2` 的分支,hyper-literate(用于超文本可读编程),仅改变了 `scribble/lp2` 并依赖于原始版本的 `scribble` 进行其余部分。
我不能保证向后兼容性,因为我目前正在修复一些错误并添加额外功能,例如能够重新打印一个 `chunk` 以刷新读者的记忆等。我链接的 `stackoverflow-q-18877881` 分支应该保持稳定。新的内容将放在 master 中。
这是一个小例子文件。在 test/test.hl.rkt 中有 一个更完整的例子
#lang hyper-literate/typed typed/racket/base

@(require (for-label typed/racket/base
                     typed/rackunit))

@title{Title}

Hello world.

@chunk[<*>
       (require typed/rackunit)

       ;; Would give an error as typed/racket/base is used on the #lang line:
       ;curry

       (check-equal? ((make-predicate One) 1) #t)

       (define (f [x : 'e123]) x)

       (define ee (ann (f 'e123) 'e123))
       (provide ee)]

1

看起来不是这样,但你可以使用带有 scribble/eval 的类型化/racket 评估器。

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

这里获取的示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接