newLISP 語言精華

沙棗發表於2016-06-30

註釋:

;; this is comment
(println "hello world")

函式定義:

(define (foo x y) (+ x y))

匿名函式:

(fn (x y) (+ x y))

使用命令列編譯指令碼為可執行檔案:

> newlisp -x uppercase.lsp uppercase.exe

布林值只有 nil 和 true, nil 就是假:

> nil
nil
> true
true

字串是用雙引號包圍, 也可以用大括號:

"hello world"
{ hello world }

符號 Symbol 是符號表中的名字:

> (set 'something 123)
> something
123

名稱空間也用符號表示:

(context 'FOO)

列表也用單引號:

> '(1 2 3)

列表可以直接索引:

> (set 'lst '(a b c (d e) (f g)))
> (lst 0) ;; a
> (lst 3) ;; (d e)
> (lst 3 1) ;; e
> (lst -1)  ;; (f g)

在 newlisp 中,雜湊是用關聯列表模擬的,要想新增一對 key,value 到這個雜湊中,要先判斷雜湊中是否存在這個 key, 如果不存在,就直接新增進去,如果存在,就修改原有的記錄:

(define (add-pair dict key value)
    (if (lookup dict key)
        (push (list key value) dict)
        (setf (lookup dict key) value)))

將新的記錄新增到關聯列表的最前面,即使已經存在相應的 key, 那麼在查詢的時候,也會被覆蓋。

(list x y) 和 (quote x y) 的不同:

list 後面的每個表示式都會進行運算,而 quote 後面的表示式都會被凍結。

> (list (+ 1 2) 2)    
(3 2)                 
> '((+ 1 2) 2)        
((+ 1 2) 2)

如果想將一個列表引用傳入函式, 當這個函式修改這個列表的內容後, 這個列表在外部也會修改.

相關文章