一直對函數式編程高度興趣,但是一直沒有相關的實踐,終於到了五一,閑來無事,故研究下。mit-scheme 不像很多scheme的解譯器那樣,它只接受標準輸入的代碼並執行,所以就不能像很多CGI在指令碼的頭部加上#!/bin/python中中方式來執行cgi。必須做一個轉換。
方法1
轉換的指令碼如下
#!/bin/shfor program in $@do tail -n+2 $program | mit-scheme --quietdone
將該代碼儲存為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/shexec tail -n+3 $0|mit-scheme --quiet;exit