顯示具有 lisp 標籤的文章。 顯示所有文章
顯示具有 lisp 標籤的文章。 顯示所有文章

2016年7月22日 星期五

scheme/racket timer 並自己實作一個 scheme timer

想知道在 scheme 上有沒有 timer 相關函式可以用, 找到了 racket。

用法像 t.rkt 那樣, 有點奇怪, 但 lisp 系就是這麼奇怪。

t.rkt
 1 #lang racket/gui
 2 
 3 (display "Loaded\n")
 4 
 5 (define atimer
 6    (new timer%
 7       [notify-callback (lambda() (display "Hello, World!\n"))]
 8       [interval 1000]
 9       [just-once? #f]))
10 (send atimer start 1000)

執行結果:
descent@u64:$ racket -t t.rkt 
Loaded
Hello, World!
Hello, World!
Hello, World!
Hello, World!
Hello, World!

這是用 gui 來測試 timer 的版本。
https://gist.github.com/Haroperi/3012175

為什麼想知道 timer 怎麼用, 因為我要在 simple scheme 加上這個, 這是未來計劃的一小步, 慢慢的來完成他。目前只有 linux 的版本支援 timer 單純試水溫, stm32f4 的版本才是我最終目的, 一步一腳印來實現這個目標。

語法和 racket 有點不同, 但 racket 的語法還是提供了靈感, 也真的可行。

(get-timer a-timer 1000 (lambda () (+ 3 2)))
(start-timer a-timer)
(stop-timer a-timer)

我用了 linux signal/setitimer 來完成這個 timer。



ref:
Scheme 初步

写本Racket入门书
http://chuansong.me/n/966489
https://github.com/tyrchen/racket-book/
http://racket.tchen.me/begin.html

string type

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

2013年3月22日 星期五

初探 lisp

終於要開始學習這個古老的語言了, 會對 lisp 有興趣是因為 emacs 的關係, 雖然我現在還不會使用 emacs, 不過先來學習 lisp 也不錯。它不是 c like 的語言, 我想看看學習這樣的語言以往的程式經驗還能適用嗎?我能快速上手 lisp 嗎?之前學習 python 能快速上手, 但對於 lisp 我沒有這樣的信心。

一樣在 linux 環境下學習。

apt-get install gcl

就可以開始練習了。

我的參考書 lisp 基礎 李漢銘 儒林:
http://books.google.com.tw/books/about/LISP%E5%9F%BA%E7%A4%8E.html?id=qvB6MwEACAAJ&redir_esc=y

為什麼沒照片? 嗯 ...

薄薄的 218 頁, 我最喜歡這種學習書籍了。

好像是 http://www.biolisp.org/llisp/index.html 中文版本。

descent@w-linux:~$ gcl 
GCL (GNU Common Lisp)  2.6.7 CLtL1    Feb 15 2010 17:57:54
Source License: LGPL(gcl,gmp), GPL(unexec,bfd,xgcl)
Binary License:  GPL due to GPL'ed components: (XGCL READLINE BFD UNEXEC)
Modifications of this banner must retain notice of a compatible license
Dedicated to the memory of W. Schelter

Use (help) to get some basic information on how to use GCL.
Temporary directory for compiler files set to /tmp/

>(car '(1 2 3 4))

1

>(cdr '(1 2 3 4))

(2 3 4)

>

令人困惑的 car, cdr

page 24 ex1 的作業就難倒我:
把這個 list 反轉, 到這裡只有 car, adr, cons, conc 這四個 function 可用。
((Bill 1234567) (simon 555) (jane 201))
變這樣:
((jane 201) (simon 555) (Bill 1234567))

> (cons (caddr '((Bill 1234567) (simon 555) (jane 201))) (cons (cadr '((Bill 1234567) (simon 555) (jane 201))) (cons (car '((Bill 1234567) (simon 555) (jane 201)) ) '()) ))

很恐怖吧!

http://blog.sina.com.cn/s/blog_5d90e82f0101jo6r.html
提到的 dynamic scoping 問題, 在 gcl 運作的方式是我們預期的那樣, 在 emacs 則不是。

在 emcas 可以這樣用:
啟動 emcas, 進入 lisp-interaction-mode

M-x lisp-interaction-mode
按下
ESC x lisp-interaction-mode

(+ 3 4)
7
(cdr '(1 2 3 4))
(2 3 4)
(car '(1 2 3 4))
1

在每行程式碼最後按下 ctrl+j 就會得到結果。

mit-scheme

install mit-scheme in linux/debian
apt-get install mit-scheme

run mit-scheme

descent@debian-vm:~$ mit-scheme

ctrl+c q exit mit-scheme


mit-scheme 教學:
http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/MITScheme_tutorial.pdf
http://faculty.csie.ntust.edu.tw/~ywu/cs4001301/Scheme_tutorial.pdf


ref:
你是如何成為Lisp程序員的?
Lisp 入門 / 序章 如何開始
use gcl compile lisp porgram