2014年7月8日 星期二

sicp: 開發工具 - mit-scheme

這本書使用的語言是 scheme, 是 lisp 的一種方言, scheme 有很多實作品, 書是 mit press, 我自然找了 mit-scheme 來用, 也是 gnu 的產品之一, 在 ms windows, linux 都可以使用; guile 也是 gnu 的 scheme 實作品。

據聞在最後一堂課時, 使用的 scheme 是 DrScheme (目前已更名為 Racket), 我沒有特別研究那個好, 只是這本書是 mit press, 我當然找 mit-scheme 來用, 書上也多少會提到 mit-scheme 有哪些 feature, 正好也是這本書的範例可以使用的功能。

其他的 Scheme implementations: http://community.schemewiki.org/?scheme-faq-standards#implementations

雖然有很多的 scheme 實作, 不過 4.1 的 metacircular evaluator 範例我在 guile, chicken 的 scheme 實作品上都無法順利執行, 若不想修改程式碼, 還是跑在 mit-scheme 比較保險。

這篇不是 scheme 的教學, 我都還不會怎麼可能寫得出教學文, 這只是在說明如何使用 mit-scheme 的開發環境和比較常用的功能。

想學 lisp 很久了, 這次就靠這本書來學習吧, scheme 也可以啦, 反正都是那種很多小括弧的東西。本書並不是專門用來教學 scheme, 只會提到範例程式中所需要的語法, 不過這樣也算夠用, 要深入的話還得參考相關 scheme 書籍。

如果要編譯 mit-scheme 可以從 http://www.gnu.org/software/mit-scheme/ 下載 Portable C 的版本, 我希望你不需要用到這招, 我在 gentoo 上需要這麼做, http://www.gnu.org/software/mit-scheme/liarc-build.html 這裡有編譯方法。

linux/debian 安裝還是用 apt-get:

apt-get install mit-scheme

windows 的安裝應該難不倒你, 你都挑了這麼冷門的東西來學, 應該和我一樣, 是個品味很特別的程式員。

最好也安裝一下說明文件, 這東西很冷門的, 幾乎找不到什麼網路教學文章, 自己 K 文件吧!

apt-get install mit-scheme-doc

執行: mit-scheme

descent@debian-vm:~$ mit-scheme

會跑出一個 mit-scheme 環境, 可以輸入程式碼, 結果會立刻跑出來, 很像 dos 下的 etbasic。

mit-scheme
 1 descent@deb64:/media/sdb1/descent/git/blog_articles/lisp$ mit-scheme
 2 MIT/GNU Scheme running under GNU/Linux
 3 Type `^C' (control-C) followed by `H' to obtain information about interrupts.
 4 
 5 Copyright (C) 2011 Massachusetts Institute of Technology
 6 This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or
 7 FITNESS FOR A PARTICULAR PURPOSE.
 8 
 9 Image saved on Friday August 30, 2013 at 4:37:34 PM
10   Release 9.1.1 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/x86-64 4.118 || Edwin 3.116
11 
12 1 ]=> (+ 1 2 3)
13 
14 ;Value: 6
15 
16 1 ]=> 

L12 就是我輸入的程式碼。

說真的, 我還真不習慣在一個 interpretation 環境下開發程式, 。

文件上建議使用 Edwin 來輸入 scheme 程式, edwin 很類似 emacs, 有除錯器的功能。
file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/Edwin.html#Edwin
說明如何使用 edwin。

我敢打賭, 你要是沒用過 emacs, 絕對恨透了 edwin 這東西, 難用到暴。還是先回到 interpretation 環境下。

mit-scheme document
file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/index.html
這文件最好先看一下, 要不然還真的不知道怎麼使用 interpretation 環境下的操作方式。

ctrl+c q exit mit-scheme
(exit) 也可以離開 mit-scheme。

(quit) 不是離開, 而是在背景執行 mit-scheme, fg 就可以把畫面叫回來。

(load "filename.scm")
可以載入一個 scheme 檔案。

4.1 Compilation Procedures
file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/Compilation-Procedures.html#Compilation-Procedures
(cf "foo")

不像 c compiler 一樣, 可以很乾脆的產生一個執行檔。他產生的 binary 只是讓 interpretation 環境載入用。

再回到開頭的 edwin, 它很難用, 不過我還是比較常用這個, 因為那個 interpretation 環境我覺得更難用。

file:///usr/share/doc/mit-scheme-doc/html/mit-scheme-user/Edwin-Scheme-Evaluation.html#Edwin-Scheme-Evaluation
會說明如何執行在 edwin 敲入的程式碼。簡單點就是在你要執行的程式碼後面按下 ctrl+x ctrl+e。

M-o 會計算檔案中所有的 express。

edwin 很類似 emacs, 所以連按鍵都很類似。

ctrl+x ctrl+f 可以載入檔案。
ctrl+x ctrl+c 離開 edwin。
ctrl+x ctrl+s 存檔。

C-@ mark
C-x C-x 可以查看 mark 的位置, 不知道意思的話, mark 完之後一直按 C-x
M-w copy
C-w delete

C-x b switch buffer
C-x k kill buffer

C-x o 切換 window
C-x 2 分割成兩個 window
C-x 0 (數字0) 關掉游標在的那個 window

edwin REPL mode:
M-x repl 可進入 REPL mode

這東西太冷門了, 希望有人因為我這篇文章一起來學習 scheme。

scheme compiler: CHICKEN Scheme, 這東西可以產生一個獨立的執行檔, 真是太酷了。

用 apt-get 搞定它。

apt-get install chicken-bin

編譯用法:
http://wiki.call-cc.org/man/4/Using%20the%20compiler

最簡單的用法, 來個階乘測試:

factorial_1.scm
 1 (define (factorial n)
 2   (define (iter product counter)
 3     (if (> counter n)
 4       product
 5       (iter (* counter product)
 6             (+ counter 1))))
 7     (iter 1 1))
 8 
 9 (write (factorial 5))
10 (newline)

csc factorial_1.scm

descent@deb64:3.1.3$ ./factorial_1 
120

要先產生出 c souce code 也行, 文件拉到最下方, 麻煩多了。

mit-scheme 教學:
  1. http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/MITScheme_tutorial.pdf
  2. http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/Scheme_tutorial.pdf
  3. Simply Scheme, second edition
  4. The Little Schemer book
  5. http://www.cs.rpi.edu/academics/courses/fall05/ai/scheme/starting.html
  6. Scheme 語言概要(上/下):
    http://www.ibm.com/developerworks/cn/linux/l-schm/index1.html
    http://www.ibm.com/developerworks/cn/linux/l-schm/index2.html
  7. http://blog.csdn.net/zzulp/article/category/682234
  8. MIT Scheme 的基本使用:
    http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm

ref:
as script:
http://snippets.dinduks.com/mit-scheme-run-a-script
http://vepa.in/technology/mit-scheme-unix-scripts-and-cgi

scheme < script.scm | grep ";Value:" | sed "s/;Value: /Result: /" 
scheme-run () { scheme < $1 | grep ";Value:" | sed "s/;Value: /Result: /" } 

Petite Chez Scheme (從 Scheme 编程环境的设置得知, 據說效能很好):
http://scheme.com/download/index.html#sec:petitechezscheme

2 則留言:

  1. 為了讀 SICP 特別碰 mit-scheme 其實沒有必要,用一些比較現代的 Lisp 也是可以的,像是 Clojure,網路上這方面資源不少,可 google「sicp clojure」

    回覆刪除
  2. 謝謝你的資訊。clojure 原來也是 lisp 系的語言。

    回覆刪除

使用 google 的 reCAPTCHA 驗證碼, 總算可以輕鬆留言了。

我實在受不了 spam 了, 又不想讓大家的眼睛花掉, 只好放棄匿名留言。這是沒辦法中的辦法了。留言的朋友需要有 google 帳號。