編寫 Racket 模塊一些簡單的記錄

週末兩天的時間寫了用 Racket 運行 Cirru Sepal 的 prototype
https://github.com/Cirru/cirrusepal-rkt
https://github.com/Cirru/cirruparser-rkt
我有個毛病就是東西開開心心寫的原型, 而後就丟着無論了.. 玩夠了吧.
Sepal 項目目標是用 Cirru 語法去寫其餘語言的 IR 或者 AST 運行..
由於 Cirru 原來就是受 Lisp 元編程啓發, 在 Lisp 當中能實現最有意思
而 Lisp 當中門檻文檔最好並且門檻也不高的, 莫過 Racket.html

我設計 Cirru 語法之前就學過點 Scheme, 但沒寫出來像樣的程序
如今的話由於漸漸理解了 immutable 數據, 感受不那麼陌生了
再說我只是用 Racket 模仿 CoffeeScript 功能, 不會涉及複雜的功能
跟以前文章同樣, 我要梳理下模塊化跟打包方面的思路, 這個很很差記憶...
也只是零零歲歲記錄一下, 萬一用到能很快找到想起來前端

模塊託管

Racket 0.6 經歷一次大的升級, 以前用的 PLaneT 再也不推薦, 只是兼容
我懷疑文件後綴從 .ss 變成 .rkt 也是這個時候改的
新的方案模塊是說在 Web 或者本地 serve 就能夠, 具體要研究下文檔
讓我關注的一個是, 代碼能夠託管在 GitHub 上, 用一個命令安裝到本地:
http://docs.racket-lang.org/pkg/getting-started.html#%28part._github-d...git

raco pkg install git://github.com/Cirru/parser-rkt

模塊 collection 概念

這個概念有點像是 npm 當中的模塊名, 但細節卻奇怪, 反正又不對應模塊名,
模塊的名字好像直接就文件名了, 若是是從 GitHub 安裝, 就是倉庫名,
通常 Racket 中 require "dir/sub" 是引用相對路徑的, 注意引號
require collection/file 沒有引號, 是引用 collection 當中的文件
Racket 運行多個模塊共用一個 collection, 可是文件又不能衝突, 很不理解
由於 collection 跟文件名分開的, 二者好像徹底搭不上了github

全部下載的文件都統一存放在系統某個目錄好比:npm

➤➤ ls /usr/local/Cellar/plt-racket/6.1.1/share/racket/collects

總之引用模塊, 引用文件, 兩種需求能夠寫出來了
而模塊的 collection 在根目錄 info.rkt 裏定義, 語法也不大肯定
具體細節仍是看文檔上吧: http://docs.racket-lang.org/pkg/metadata.html編程

racket#lang info
(define collection "cirrusepal")

模塊開發

開發模塊的時候, 可能根據模塊名字引用文件已經有須要了, 因此通常會作 link,
link 實際實際上就是在安裝目錄跑一個命令, 把開發中的模塊安裝到全局:ide

textraco pkg install

實際上就是在某個文件路記錄了連接的信息而已:模塊化

text➤➤ raco pkg show
Installation-wide:
 Package       Checksum                                    Source
 racket-lib    436f0928598fc1a8abf27422e8e6588bef45f652    (catalog racket-lib)
User-specific for installation "6.1.1":
 Package       Checksum    Source
 parser-rkt    #f          (link ../../../../repo/cirru/parser-rkt)
 sepal-rkt     #f          (link ../../../../repo/cirru/sepal-rkt)
➤➤ cat ~/Library/Racket/6.1.1/share/info-cache.rktd
((#"../../../../repo/cirru/sepal-rkt" (collection version) (lib "cirrusepal") 1 0) (#"../../../../repo/cirru/parser-rkt" (collection version) (lib "cirruparser") 1 0))

模塊 require provide 語法

文件之間, 模塊之間, 怎樣相互引用, 上面大概描述了一遍
而後是文件導出代碼的方法... 用關鍵字標記就行了, 看文檔:
http://docs.racket-lang.org/guide/module-basics.html
注意關鍵字是奇怪的 provide, 不是前端某個新加的關鍵字ui

而後頂部的 #lang racket 是特殊的語法, 是 module 的簡寫
具體看文檔, 好像照着別人的用法直接寫就算了...
http://docs.racket-lang.org/guide/Module_Syntax.html#%28part._hash-lan...spa

Racket 是有意思的語言, 但我估計不會深刻挖, 須要時候查文檔就算了, 很全的
http://learnxinyminutes.com/docs/racket/
http://docs.racket-lang.org/reference/index.html

關於 eval

另外關於 Sepal 核心的原理, eval 使用時要注意點東西, 看這個回答:
http://stackoverflow.com/a/22742799/883571

racket(define ns (make-base-namespace))
(define expr '(+ x 1))
(for/list ((x '(2 5 3 1 99 12)))
  (eval `(let ((x ,x)) ,expr) ns))
=> '(3 6 4 2 100 13)

我也只是零零碎碎記一點東西, 目前沒時間沒興趣深刻去學 Racket.

相關文章
相關標籤/搜索