5

是否可以使用 other #langs in#lang scribble/lp进行识字编程?

例如,我想使用#lang typed/racketin #lang scribble/lp。如何意识到这一点?

4

2 回答 2

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

示例取自这里

于 2013-12-05T17:34:59.617 回答
1

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))所做的那样制作一个“别名” 。testmain

还要记住,子模块的嵌套越多,它被访问和/或实例化的次数就越多(不确定是哪个)。这可能会对类型化/球拍程序的加载速度产生严重影响,因为它们本身已经被多次访问和/或实例化。您可以通过添加(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)]
于 2016-06-17T15:12:43.770 回答