除了学习Racket,我还在努力学习文学编程.不幸的是,关于scribble/lp,Racket文档很少说.有人能指出我在这个主题上有更好的资源或用Racket编写的文学程序的例子吗?
非常感谢你.
我正在尝试用Racket的scribble/lp编写一个小例子程序.该项目的来源是在Github上.
我遇到的问题是编织html中的链接断开.我已将它作为gh页面提供.对于该项目.
使用命令'Sribble LPexample.scrbl'输出文档时,我收到以下警告:
2013 blog > scribble LPexample.scrbl
[Output to LPexample.html]
Warning: some cross references may be broken due to undefined tags:
(dep ((lib "2htdp/image.rkt") ellipse))
(mod-path "racket")
(dep ((lib "2htdp/image.rkt") beside/align))
(dep ((lib "2htdp/image.rkt") rectangle))
(mod-path "scribble/lp")
Run Code Online (Sandbox Code Playgroud)
并且输出文件在断开的链接下放置红色下划线.
被潦草的文件是LPexample.scrbl.这很简单:
#lang scribble/manual
@require[scribble/lp-include]
@title{Literate Programming Example}
// snip
@lp-include["LPexample.rkt"]
Run Code Online (Sandbox Code Playgroud)
获取断开链接的文字编程文档的部分是第69-86行:
which weaves to this:
@chunk[<blue_square>
(rectangle 100 100 "solid" "blue")]
can be composed into other functions this way:
@verbatim|{
@chunk[<blue_square>
(beside/align "bottom"
(ellipse 20 70 …Run Code Online (Sandbox Code Playgroud) 是否可以使用其他#langs in#lang scribble/lp进行文学编程?
例如,我想#lang typed/racket在#lang scribble/lp. 如何意识到这一点?
我正在尝试用于defproc格式化函数定义(而不是记录库)。下面的代码获得了正确的格式,但是当我运行 Scribble 时会向控制台打印一个丑陋的警告:
#lang scribble/manual
@require[(for-label racket/contract)]
@defproc[(f [x integer?]) integer?]{
The best @racket[f].
}
Run Code Online (Sandbox Code Playgroud)
运行scribble --html example.scrbl打印:
example.scrbl:4:10: WARNING: no declared exporting libraries for definition
in: f
Run Code Online (Sandbox Code Playgroud)
有什么方法可以defproc用于格式化,并删除错误消息?
我可以用image在我的涂鸦文档中嵌入图像,渲染函数会将其复制到目标目的地。现在,我还想在我的文档中包含非图像的文件,例如可以下载的 MP3 或 PDF 文件。
此外,我不能只将文件包含在源文件夹中并链接到它,因为如果我将文档渲染到不同的目标文件夹中,它不会被复制。
最后,我知道我可以手动创建目标目录,并将文件粘贴到那里。或者,我可以修改用于构建文档的任何文件来复制该文件。但这并不令人满意,因为现在我必须在两个地方跟踪图像。这.scrbl文件以及目标目录或构建文件。
那么,在涂鸦中是否有一种方法可以包含非涂鸦(或图像)文件(例如 MP3 或 PDF),以便渲染函数知道抓取它并将其包含在文档中?
我知道 Racket 没有像许多其他语言那样具有“文档字符串”,但考虑到在源代码中记录事物是多么方便,我想在 Racket 中近似类似的东西。
当我第一次了解 Scribble 和 #langs 时,我认为可以做如下事情:
#lang racket
#lang scribble
Run Code Online (Sandbox Code Playgroud)
...然后在 Racket 中使用 Scribble 中的文档字符串编写代码。但这行不通,可能是因为“语言不会组合”。
#lang racket
(require scribble/manual)
@racket['hi]
Run Code Online (Sandbox Code Playgroud)
结果是:
my-source.rkt:4:0: @racket: unbound identifier
Run Code Online (Sandbox Code Playgroud)
我发现这似乎很引人注目,因为听起来它允许您在合同scribble/srcdoc之上搭载文档,这些文档已经作为一种最小(通常是模块级)文档,当然除了提供运行时检查之外。到目前为止我还没能让它工作,但我认为在这里询问它会更有用,而不是再折腾几个小时。就其价值而言,这就是我目前所看到的:
#lang racket
(require scribble/srcdoc
(for-doc scribble/base scribble/manual))
(provide
(proc-doc/names fib
(-> integer? integer?)
(n)
@{Computes the @racket[n]th Fibonacci number}))
(define (fib n)
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))
Run Code Online (Sandbox Code Playgroud)
结果是:
my-source.rkt:6:1: proc-doc/names: bad syntax
in: (proc-doc/names fib (-> integer? integer?) …Run Code Online (Sandbox Code Playgroud) 所以,我使用scribble/lp模块使用plt-scheme编写我的第一个文字程序:
#lang scribble/lp
(require scribble/lp)
<<lp_scheme.ss>>
@chunk[<squarefunction>
(define (f x)
(* x x))]
Run Code Online (Sandbox Code Playgroud)
当然没有什么有用的.现在我有点想知道为什么我不会使用简单的注释,而不是文字编程结构.任何意见欢迎.如果有人可能有更多的曝光/曝光,那将是非常好的.有了它可能会更直观地解释良好记录的代码和使用Literate编程结构编写的代码之间的差异.