是否可以使用 other #lang
s in#lang scribble/lp
进行识字编程?
例如,我想使用#lang typed/racket
in #lang scribble/lp
。如何意识到这一点?
是否可以使用 other #lang
s in#lang scribble/lp
进行识字编程?
例如,我想使用#lang typed/racket
in #lang scribble/lp
。如何意识到这一点?
看起来并非如此,但您可以使用带有 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)]
示例取自这里。
TL;DR:有两种方法。首先,您可以简单地将您的代码放在一个子模块中,并立即要求它。其次,您可以使用我的 fork ofscribble/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
其中,因为它不会被执行。在这里,我有一个(module+ test …)
inside main
,它是test
根级别的模块所必需的。如果(module test
根目录下的 被注释掉,那么测试将不会被执行。
当从另一个模块请求时,同样的问题也适用moo
,您必须使用,或像上面对and(require (submod "myfile.lp2.typed.rkt" main moo))
所做的那样制作一个“别名” 。test
main
还要记住,子模块的嵌套越多,它被访问和/或实例化的次数就越多(不确定是哪个)。这可能会对类型化/球拍程序的加载速度产生严重影响,因为它们本身已经被多次访问和/或实例化。您可以通过添加(begin-for-syntax (displayln 'executed))
代码来看到这一点,它会被打印很多次。
我的scribble/lp2
, hyper-literate(用于超文本识字编程)的分支仅更改scribble/lp2
并依赖于scribble
其余部分的原始版本。
我不保证向后兼容性,因为我目前正在修复一些错误并添加额外的功能,例如能够重新打印 achunk
以刷新读者的记忆等。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)]