首页 > 解决方案 > 方案中的 printf

问题描述

我将如何在方案中执行以下操作?

printf("I went to the park at %d with %s", 4, "Bob");

我现在最接近的是:

(define TIME 4)
(define NAME "Bob")
(display "I went to the park at ") (display TIME) (display " with ") (display NAME) (display ".")

标签: schemelisp

解决方案


您不能在标准方案中执行此操作。许多 Scheme 实现都有一个以Common Lispformat为模型的过程。例如,Chez Scheme 有一个非常完整的实现,而且它只是一个. 我已经习惯了使用,我从没想过在 lisps 中使用:formatformatprintfformatformatprintf

> (format #t "I went to the park at ~A with ~A~%" 4 "Bob")
I went to the park at 4 with Bob
> (printf "I went to the park at ~A with ~A~%" 4 "Bob")
I went to the park at 4 with Bob

当第一个参数为;时,此处format将输出发送到当前输出端口 自动将输出发送到当前输出端口。Common Lisp 样式格式指令以波浪号 ( ) 为前缀。或美学指令以人类可读的形式打印对象,并且是您大部分时间想要的。还有其他用于格式化数字的指令;我添加了指令,它发出一个换行符。您的原始示例不包含换行符,并且至少在 C 中不会在输出末尾添加换行符(通常这是可取的)。与所有s 之母(即 C's )相比,该过程应该允许对结果进行更多的控制。#tprintf~~A~%printfformatprintffprintf

打印格式化输出的具体工具取决于实现,但 Chez Scheme、MIT Scheme、Gauche Scheme 和 Guile 都实现了format. Chicken Scheme 实现了format,也实现了printf, fprintf,并且sprintf它们都使用与 . 相同的格式指令format。Racket 有许多格式化的输出程序,包括format, printf, 和fprintf; 所有这些也都使用 Common Lisp 风格的格式指令。

您必须查阅特定实现的文档以了解支持哪些格式指令以及它们如何工作;Chez Scheme 文档包含一些信息,但建议咨询 Common Lisp HyperSpec 以获得完整的文档。

还有SRFI-28(基本格式字符串)SRFI-48(中间格式字符串)为支持它们的实现提供了一些功能。


推荐阅读