是否可以在#lang scribble/lp中使用其他#lang进行识字编程?
例如,我想在#lang scribble/lp中使用#lang typed/racket。如何实现这一点?
发布于 2013-12-06 01:35:00
它看起来不是这样的,但您可以使用带有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的例子。
发布于 2016-06-17 23:12:44
戴利:有两种方法。首先,您可以简单地将代码放在一个子模块中,并立即请求它。其次,您可以使用 ,它允许您指定底层模块语言。
第一种方法
由于an issue,您必须将整个过程包装在一个(begin …)中,尽管有一个pull请求应该会在途中修复这个问题。
#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)),或者创建一个“别名”,就像上面为test和main所做的那样。
还要记住,子模块嵌套越多,它被访问和/或实例化的次数就越多(不确定是哪个)。这可能会严重影响类型化/球拍程序的加载速度,因为它们本身已经被访问和/或实例化多次。您可以通过在代码中添加(begin-for-syntax (displayln 'executed))来查看这一点,它会打印很多次。
第二种方法
我的scribble/lp2分支hyper-literate (用于超文本编程)只改变scribble/lp2,其余的依赖于scribble的原始版本。
我不能保证向后兼容,因为我目前正在修复一些bug,并添加额外的功能,比如能够重新打印chunk以刷新读者的记忆等。不过,我链接到的stackoverflow-q-18877881分支应该保持稳定。更新的东西将放在master中。
这是一个很小的示例文件。这是a more complete example in 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)]https://stackoverflow.com/questions/18877881
复制相似问题