有没有办法从Racket REPL中查看函数的源代码?

时间:2012-04-11 21:30:47

标签: scheme racket read-eval-print-loop

我正在尝试潜入Racket / Scheme。我有一个在我的编辑器旁边运行的(X)REPL的实例,这有助于我极大地探索这种语言。但是,我似乎无法找到一个XREPL命令或宏(或其他),它会向我显示函数的源代码。

所有需要的部分似乎都在那里:

XREPL的describe命令知道文件:

-> ,describe string-join
; `string-join' is a bound identifier,
;   defined in racket/string.rkt
;   required directly

get-collects-search-dirs知道路径:

-> (require setup/dirs)
-> (get-collects-search-dirs)
'(#<path:/home/richard/.racket/5.2.1/collects>
  #<path:/usr/local/lib/racket/collects>)

在我们所拥有的事物的反思方面:

-> (procedure-arity string-join)
2

但如果你想知道的是如何调用这个函数,那么它就没有用了。 有没有办法访问函数的实现,或至少参数名称?

或者,这对我来说也有用 - 某些与help打开的文档相当的in-REPL纯文本?

3 个答案:

答案 0 :(得分:4)

Eli Barzilay指出Geiser项目包含code来提取此文档。


我确实有一些实验性的源代码可以从HTML文档中提取文本,尽管该代码可能已经过了改进。

请参阅:https://github.com/dyoo/wescheme-docs/blob/master/test-extract-docstring.rkt

及其依赖项,它们位于:https://github.com/dyoo/wescheme-docs

我编写的extract-docstring.rkt库在Racket 5.2.1下工作,但我承认从文档中提取文本时,我确实做了一些非常棘手的事情。

可能值得告诉Racket Users mailing list的人们,xrepl能够访问基于文本的文档是一件很重要的事情;也许它会得到推动力。

答案 1 :(得分:4)

几周前,XREPL ,describe命令被增强,用于打印函数参数名称和契约; source

这是来自Racket文档的“蓝盒子” - 之所以这么称呼是因为在Racket 6 CSS重新设计之前它们曾经是蓝色的;现在他们实际上是灰色的:)。

你可以通过从HEAD建立Racket来实现这一目标。否则,它应该在6.1之后的下一个版本中。

请记住,这似乎仅限于在已安装的软件包中包含Scribble文档的功能。

答案 2 :(得分:3)

我不确定这是否适用于Racket,但在麻省理工学院计划中有几个内置程序可以让你接近。 (下面,proc代表任何程序)

    正如您所提到的
  1. (procedure-arity proc)将为您提供参数数量
  2. (pa proc)将打印参数列表
  3. (pp proc)将打印程序正文
  4. 这适用于许多内置程序以及您自己定义的任何程序,但如果您尝试使用defineset!这样的特殊表单调用其中任何一个,您将获得错误。