一直对函数式编程很感兴趣,但是一直没有相关的实践,终于到了五一,闲来无事,故研究下。mit-scheme 不像很多scheme的解释器那样,它只接受标准输入的代码并执行,所以就不能像很多CGI在脚本的头部加上#!/bin/python中中方式来执行cgi。必须做一个转换。
方法1
转换的脚本如下
#!/bin/sh
for program in $@
do
tail -n+2 $program | mit-scheme --quiet
done
将该代码保存为scm.sh 并给该脚本增加可执行权限,放在指定目录下。如/usr/bin下。
在你写的scheme代码文件的首部增加一句
#!/usr/bin/scm.sh
告诉linux你想要使用scm.sh来解析该脚本,然后scm.sh 将当前的scheme脚本去除第一行,通过管道传输给mit-scheme,然后mit-scheme执行完吐回结果。
我的test.scm脚本如下
#!/srv/www/cgi-bin/scm.sh
(display "content-type: text/plain") (newline)
(newline)
(display "hello lisp")
(define getenv get-environment-variable)
(map
(lambda (env-var)
(display env-var)
(display " = ")
(display (or (getenv env-var) ""))
(newline))
'("AUTH_TYPE"
"CONTENT_LENGTH"
"CONTENT_TYPE"
"DOCUMENT_ROOT"
"GATEWAY_INTERFACE"
"HTTP_ACCEPT"
"HTTP_REFERER" ; [sic]
"HTTP_USER_AGENT"
"PATH_INFO"
"PATH_TRANSLATED"
"QUERY_STRING"
"REMOTE_ADDR"
"REMOTE_HOST"
"REMOTE_IDENT"
"REMOTE_USER"
"REQUEST_METHOD"
"SCRIPT_NAME"
"SERVER_NAME"
"SERVER_PORT"
"SERVER_PROTOCOL"
"SERVER_SOFTWARE"))
执行结果如下
方法2
在scheme的脚本前面加入一下两行代码
#!/bin/sh
exec tail -n+3 $0|mit-scheme --quiet;exit