我有一个scheme
程序,使用以下命令执行该程序
; (primes<= n)
,给我所有小于的素数n
例如,; (primes<= 200)
给我所有小于 200 的素数
如何在 Linux 中为以下程序创建可执行文件n
作为参数
---------方案方案---------------------------------------------------- ---------
#lang racket
(define (interval-list m n)
(if (> m n)
'()
(cons m (interval-list (+ 1 m) n))))
(define (sieve l)
(define (remove-multiples n l)
(if (null? l)
'()
(if (= (modulo (car l) n) 0) ; division test
(remove-multiples n (cdr l))
(cons (car l)
(remove-multiples n (cdr l))))))
(if (null? l)
'()
(cons (car l)
(sieve (remove-multiples (car l) (cdr l))))))
(define (primes<= n)
(sieve (interval-list 2 n)))
上面的程序执行为(primes<= 100)打印所有小于100的素数
答案1
我相信您会想要检查您的计划系统的文档:
- 编译为本机可执行文件,以及
- 从 OS shell 传递命令行参数
例如,如果您正在使用麻省理工学院/GNU 计划,我建议您参考:
如果您可以灵活选择使用哪种Scheme解释器,MIT/GNUScheme已移植到许多操作系统,包括Linux,因此对于上面的示例来说效果很好。
答案2
为了将此Scheme程序转换为运行Scheme解释器的文件,请使用舍邦行,并使其可执行(chmod +x /path/to/program
)。 shebang 行是可执行文件的第一行,以 开头,#!
后跟解释器的完整路径。由于您使用的是球拍:
#!/usr/bin/racket
如果您不想指定解释器的完整路径,而是希望在可执行搜索路径中查找它$PATH
,则使用
#!/usr/bin/env racket
为了访问命令行参数,Racket 提供了一个命令行解析库](http://docs.racket-lang.org/reference/Command-Line_Parsing.html),或者您可以直接检索命令行参数(current-command-line-arguments)
。您需要使用racket
以下-f
选项调用:
#!/usr/bin/racket -f
…
(define arg (string->number (vector-ref (current-command-line-arguments) 0)))
(display (primes<= arg))
(newline)
这不能与在 中#!/usr/bin/env
查找结合使用。如果你想要这样,请将你的脚本设为racket
$PATH
多语言:
#!/bin/sh
":"; exec racket -f "$0" "$@"
…
如果您希望您的脚本可以跨Scheme实现移植,那么只要实现遵循以下原则,这是可能的SRFI 22(Racket 没有)。
#!/usr/bin/env scheme-r5rs
…
(define (main argv)
(display (primes<= (string->number (list-ref argv 1))))
(newline))