2009-11-02 60 views
4

给定表达式'(lambda(x)x)如何将其转换为字符串。我认为符号 - >字符串将完成这项工作,但没有它不能符号。将方案表达式转换为字符串

例如,对于宏字符串: (到字符串(拉姆达(x)x)),应返回>> “(拉姆达(x)x)”

任何想法乡亲感谢

+0

只是澄清我正在处理引用列表。我会走过列表并做字符串连接,但后来我不知道如何处理可变因子e,g'(lambda(x。y)(display x)(display y)) – user200654 2009-11-02 01:02:52

回答

1

你应该穿过这些孔雀。当一个新的缺点开始写入“(”,当它结束时写入“)”并在符号内部使用符号 - >字符串作为符号。

您可以通过类型调度来扩展它。方案中也可能存在漂亮的印花?

+0

感谢Trickster的快速响应。我也想到了这个解决方案,但后来我不知道如何处理可变参数的例子,例如 '(lambda(x。y)(+ x y))如何实际知道。在x和y之间并输出“(lambda(x。y)(+ xy))“ – user200654 2009-11-02 00:44:52

+0

好,(xy)是(cons x(cons y nil))和(x。y)是(cons xy) – 2009-11-02 01:03:59

1

使用pretty-format

(pretty-format v [columns]) → string? 
+0

不幸的是我使用的Scheme实现没有实现漂亮格式:(任何其他的替代? – user200654 2009-11-02 00:48:04

4

表达: “(拉姆达(x)x)

是引用列表。

表达 (拉姆达(x)的x)的

是某种编译的,不透明的,可执行程序,运行时的内部的对象。

符号 - >字符串只是简单地将符号转换为一个字符串,这是一个字符序列。

如果您使用的是列表,您可以简单地遍历列表并打印出各个组件。实际上(写'(lambda(x)x))只会列出列表。

许多方案都有类似于(with-output-to-string ...),它返回一个写入标准端口的所有输出的字符串。但是,如果你这样做(写(lambda(x)x)),你会得到谁知道什么。转储可执行函数类型时,您将获得实现提供的任何内容。有些人可能会打印显示源代码的“反汇编”。其他人可能只是打印“#功能”或其他同样无用的东西。

总之,如果你只是想列出一个列表,有各种各样的机制。

如果你想打印出一个编译函数的源代码,那是一个完全不同的问题,非常依赖于实现,而且可能是不可能的。

5

标准方案(至少在R5RS的意义上)没有办法做到这一点,所以如果你想要便携式代码,你需要自己走结构。单调乏味,但不是太复杂(即使是虚线列表)。 但是,如果你只想一些工作版本,那么你应该看看你的实施手册,并寻找做到这一点的方式。答案几乎总是很简单,例如,在PLT计划中,您将使用(format "~s" '(lambda ...))

+0

答案是正确的,虽然支持SRFI 6的实现,你可以做一个输出字符串端口,并写入它。 – 2009-11-02 07:19:31

+0

关键是,直接这样做可以在某些情况下更有效。 (是的,参考实现使用srfi-6,但是实现通常会使用他们拥有的任何内置参数 - srfi-26的mzscheme实现只是使用它的格式自己的'格式'。) – 2009-11-02 07:59:18