是否可以使用#lang
中的其他#lang scribble/lp
进行文字编程?
例如,我想在#lang typed/racket
中使用#lang scribble/lp
。如何实现?
答案 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