将Scheme表达式转换为字符串

use*_*654 5 string macros lambda scheme expression

给定一个表达式'(lambda(x)x)如何将其转换为字符串.我认为symbol-> string会完成这项工作,但不能没有符号.

例如,对于一个宏的字符串:( to-string(lambda(x)x))这应该返回>>"(lambda(x)x)"

任何想法的人都谢谢

Eli*_*lay 7

标准方案(至少在R5RS意义上)无法做到这一点,所以如果你想要可移植的代码,你需要自己走这个结构.繁琐但不太复杂(即使是虚线列表).但是如果你只是想要一些工作版本,那么你应该查看你的实现手册并搜索这样做的方法.答案几乎总是很简单,例如,您使用的PLT计划(format "~s" '(lambda ...))

  • 这个答案是正确的,尽管使用支持SRFI 6的实现,您只需创建一个输出字符串端口,然后对其进行“写入”即可。 (2认同)

Wil*_*ung 5

表达式'(lambda (x) x)是一个带引号的列表。

表达式(lambda (x) x)是某种编译的、不透明的、可执行的、运行时的内部对象。

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

如果您正在处理一个列表,您可以简单地遍历该列表并打印出各个组件。实际上(write '(lambda (x) x))只会简单地将列表打印出来。

许多方案类似于(with-output-to-string ... )返回写入标准端口的所有输出的字符串。

但是,如果你这样做(write (lambda (x) x)),你会得到谁知道。转储可执行函数类型时,您将获得实现提供的任何内容。有些人可能会打印显示源代码的“反汇编”。其他人可能只是打印#function或同样无用的东西。

简而言之,如果你只是想打印一个列表,有各种各样的机制。

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


Ily*_*rov 1

你应该走过这些缺点。当一个新的cons开始时写“(”,当它结束时写“)”并使用symbol->string作为conses内的符号。

您可以通过类型分派来扩展它。方案中可能也存在漂亮的印刷品吗?