【发布时间】:2009-07-24 06:13:56
【问题描述】:
如何在 linux(ubuntu) 中从终端运行 Scheme 程序?另外,如何在 Scheme 程序中接受来自命令行的参数?
编辑:我使用 DrScheme 实现。
【问题讨论】:
标签: linux command-line scheme
如何在 linux(ubuntu) 中从终端运行 Scheme 程序?另外,如何在 Scheme 程序中接受来自命令行的参数?
编辑:我使用 DrScheme 实现。
【问题讨论】:
标签: linux command-line scheme
DrScheme 方案实现,以及用于从命令行执行它的名称,是mzscheme。在这里可以找到启动命令行脚本的文档:Unix Scripts (PLT Scheme documentation)。这里解释了命令行参数的使用:Command-line Parsing (PLT Scheme Documentation)。
结果是您可以像这样使用 shebang 脚本:
#! /usr/bin/env mzscheme
#lang scheme/base
(...scheme s-exps...)
或者如果您想要更多地控制mzscheme 的命令行标志,您需要像这样启动脚本:
#! /bin/sh
#|
exec mzscheme -cu "$0" ${1+"$@"}
|#
#lang scheme/base
(...scheme s-exps...)
你用来处理命令行参数的函数是command-line。您将在第二个链接所链接的文章中找到如何使用它的示例。
【讨论】:
在R6RS 中没有标准化。有一个建议SRFI-22,一些口译员支持。如果您的解释器不支持 SRFI-22,那么这取决于您的实现。
以下是来自 SRFI 的示例。它假定您的解释器是一个名为 scheme-r5rs 的二进制文件。基本上它调用一个名为 main 的函数,它带有一个 arg,它是一个命令行 args 列表。
#! /usr/bin/env scheme-r5rs
(define (main arguments)
(for-each display-file (cdr arguments))
0)
(define (display-file filename)
(call-with-input-file filename
(lambda (port)
(let loop ()
(let ((thing (read-char port)))
(if (not (eof-object? thing))
(begin
(write-char thing)
(loop))))))))
【讨论】:
这个解决方案适合我
#! /usr/bin/env guile
!#
(display "hello")
(newline)
【讨论】:
还有如何接受来自 Scheme程序中的命令行?
R6RS 库定义了一个名为command-line 的函数,它返回参数列表(第一个是程序的名称)。不过,并非所有 Scheme 的实现都实现了 R6RS。您的实现可能有一些其他功能。
如何运行 Scheme 程序 linux(ubuntu)中的终端?
这取决于您使用的 Scheme 实现。
【讨论】: