关闭

Gambit 2.Gambit解释器

标签: GambitScheme解释器
98人阅读 评论(0) 收藏 举报
分类:
gsi [-:runtimeoption,…] [-i] [-f] [-v] [[-] [-e expressions] [file]]

2.1交互模式

交互模式是一个”读-执行-打印 循环(read-eval-print loop)” 简称REPL。

输入和输出通过交互信道进行相互作用。交互通道可以通过运行时选项来指定,如果没有指定,取决于系统的默认配置。默认情况下,’(current-input-port)’,’(current-output-port)’和’(current-error-port)’ 都指向交互信道。

表达式在全局交互环境中进行运算。解释器通过定义和宏定义的形式向环境中追加定义内容。

例:
$ gsi
Gambit v4.8.5

> (define (fact n) (if (< n 2) 1 (* n (fact (- n 1)))))
> (map fact '(1 2 3 4 5 6))
(1 2 6 24 120 720)
> (values (fact 10) (fact 40))
3628800
815915283247897734345611269596115894272000000000
> ,q      ;结束

2.2批处理模式

在批处理模式中,命令行中的文件是用于被加载的代码文件。(‘-‘选项)进入REPL,(‘-e’选项)后接表达式字符串。(‘-‘和’-e’选项)可以与文件名多次出现在命令行上。

文件的扩展名未指定时,自动查找该无扩展名的文件,若该文件也不存在时,查找版本号为1的该文件名对应的’.on’文件,若也不存在,就查找对应的’.scm’或’.six’文件(两种文件以更新时间最新的优先)。
※’.six’是中缀式文件,参照第18章。

2.3进程退出状态

正常结束时,退出状态为0,否则为非0值。

错误状态表:
64 - 启动参数(运行时参数)或环境变量GAMBOPT包含语法错误或无效。
70 - 收到未被处理的线程异常。
71 - 初始化运行时系统出现问题,例如申请的内存不足。

$ gsi -:d0 -e "(pretty-print (expt 2 100))"
1267650600228229401496703205376
$ echo $?
0
$ gsi -:d0,unknown # try to use an unknown runtime option
$ echo $?
64
$ gsi -:d0 nonexistent.scm # try to load a file that does not exist
$ echo $?
70
$ gsi nonexistent.scm
*** ERROR IN ##main -- No such file or directory
(load "nonexistent.scm")
$ echo $?
70

$ gsi -:m4000000 # ask for a 4 gigabyte heap
*** malloc: vm_allocate(size=528384) failed (error code=3)
*** malloc[15068]: error: Can't allocate region
$ echo $?
71

注:
'-:d0'       - 禁止输出错误信息。
'-:m4000000' - 设置堆的最小大小为。 

2.4脚本

#!/usr/local/Gambit/bin/gsi-script

(for-each pretty-print (directory-files))

或中缀式脚本:

#!/usr/local/Gambit/bin/six-script

void main (obj n_str)
{
  int n = \string->number(n_str);
  for (int i=1; i<=n; i++)
    \pretty-print(i);
}

为了提高可移植性,一个比较好的办法是,利用’/usr/bin/env’,这样程序就会通过用户的’PATH’定义来查找解释器的路径。

#!/usr/bin/env gsi-script

(define (display-file filename)
  (display (call-with-input-file filename
             (lambda (port)
               (read-line port #f)))))

(for-each display-file (cdr (command-line)))

2.5编译脚本

$ cat square.scm
#!/usr/local/Gambit/bin/gsi-script -:d0
(define (main arg)
  (pretty-print (expt (string->number arg) 2)))
$ gsi square 30        # gsi will load square.scm
900
$ gsc -exe square      # compile the script to a standalone program
$ ./square 30
900
$ ./square 1 2 3       # too many arguments to main
$ echo $?
70
$ ./square -:d1 1 2 3  # ask for error message
*** ERROR -- Wrong number of arguments passed to procedure
(main "1" "2" "3")
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:28283次
    • 积分:701
    • 等级:
    • 排名:千里之外
    • 原创:30篇
    • 转载:50篇
    • 译文:6篇
    • 评论:3条
    最新评论