如何優雅的入門LISP(一)

2021-06-22 16:54:22 字數 2517 閱讀 5123

*其實我不會lisp,以下內容都是我瞎編的*

笑話一則:

乙個間諜從nasa的主機盜取了乙個用lisp編寫的核心程式,為了證明自己說的是真話,他列印出了程式的最後一頁: 

)))))))))))))))))))))))))))))

))))))))

))))))))))))))))))))))))))))))))))))))))

))))))))))))))))))))))))))))))))

lisp程式是由形式(form)排列起來構成的。它通過以下規則進行求值。

1、符號(symbol)會被解釋為變數,求出該變數所繫結的值。

2、除符號以外的原子,則求出其自身的值。即:整數就是整數本身,字串就是字串本身。

3、如果形式為表,則頭乙個符號為函式名,剩餘的元素為引數(這是commonlisp等lisp-2系列的lisp中的行為)。

表示函式名的部分,還分為函式、特殊形式和巨集三種型別。

1、函式在將引數求值後會被呼叫。

2、特殊形式相當於其他語言的控制結構,比如賦值 (setq n 10)。

3、lisp中的巨集,可以在對表示式求值時,通過對構成程式的表進行操作,從而改寫程式本身。

quote 操作符接受乙個實參,並完封不動地返回它。

common lisp 定義 ' 作為 quote 的縮寫。

(format t "hello, lisp~%")

(format t "~a plus ~a equals ~a. ~%" 1 2 3)

hello, lisp

1 plus 2 equals 3.

(setq n 10)

(print n)

(let ( (x 1) (y 2) ) 

(format t "x = ~a, y = ~a. ~%" x y))

(let ( (q 3) )

(format t "q = ~a. ~%" q))

x = 1, y = 2.

q = 3.

(defparameter *glob* 99)

(defparameter *pi* 3.14)

(format t "glob = ~a, pi = ~a. ~%" *glob* *pi*)

glob = 99, pi = 3.14.

(defconstant const *glob*)

(defconstant const2 123)

(format t "const = ~a, const2 = ~a. ~%" const const2)

const = 99, const2 = 123.

(setf *glob* 999999)

(let ((n 10)) (setf n 2) (format t "glob = ~a, n = ~a" *glob* n))

glob = 999999, n = 2

(print (+ 2 3 4))

(let ((a 10))

(setf a (* a 3))

(print a))

9

符號 t 表示真, nil 表示假,空表()也表示假。

函式listp:若引數是乙個列表則返回真。

函式null:若引數是乙個空表則返回真。

函式not:若引數是nil則返回真。

條件式if接受三個引數,乙個test表示式、乙個then表示式、乙個else表示式。最後乙個引數可以省略。

若test求值為 t,則對then表示式求值並返回該值,若為nil,則對else表示式求值並返回該值。

(if (> 2 3)

(print 2)

(print 3))

3

(print

(if (listp '(a b c))

(+ 1 2)

(+ 5 6)))

3

do是最基本的迭代操作符

do的第乙個引數是一組變數的初始化列表,每個元素是如下形式(variable initial update),表示變數名、初值、每次迴圈要做的操作。

第二個引數是乙個或多個表示式,第乙個表示式用來測試迴圈終止,其餘的表示式依次求值,最後乙個表示式作為do的返回值。

接下來的引數是迴圈體,每次迴圈依次執行。

(print

(do ((i 0 (+ i 1)))

((> i 10) 9999)

(print i)))

0

defun來定義函式,通常接受三個以上的引數,第乙個引數是函式名;第二個引數是乙個列表,裡面是函式接受的引數;第三個引數是表示式列表,即函式主體。

如何優雅的入門golang

golang標準庫文件 高效能分布式系統開發 海量並行處理 遊戲服務端開發再好不過了 package main import fmt func main 複製 go run main.go hello world 複製 識別符號用來命名變數 型別等程式體。乙個或者多個字母 a za z 數字 0 9...

如何優雅的建立物件(一)

在建立物件的時候大部分程式設計師都是直接用new的形式。下面來講解另乙個建立物件的方式,用靜態工廠方法代替構造器。比如我們想得到乙個integer物件,可以直接new得到,也可以用integer.valueof 這個靜態方法直接得到。int a 5 integer b newinteger a in...

如何優雅的送禮?

送禮的尺度要以法律規定和公司制度為紅線,在職場上,肯定不能送重禮,否則可能成為商業賄賂。很多國際化的公司都有明確的送禮和收禮規定,不能超過幾百元。牢記這一條,你就會發現有創意是多麼的重要,因為你的預算空間實在很小。送禮這件事,從策劃選禮物到對方接收到禮物是乙個操作過程,最重要的是送禮時刻。其實對於有...