使用参数为方案程序创建可执行文件

使用参数为方案程序创建可执行文件

我有一个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))

相关内容