Lisp語言入門

2021-10-19 14:26:23 字數 2490 閱讀 6858

目錄

一,執行環境

2,本地互動執行環境

二,輸入輸出

1,輸入

2,輸出

三,變數

1,格式化輸出

2,變數賦值 setf

四,函式

1,無參函式

2,帶參函式

3,關鍵字形參

五,列表

1,表list、按下標取元素nth

2,解引用quote

3,屬性表plist、按key取元素getf

六,引用表示式求值eval

七,列表篩選 remove-if、remove-if-not

八,lambda表示式

九,巨集1,reverse反轉列表

2,巨集本文中,「得到」指的都是互動執行環境中得到的結果

(setf x (read))

這樣就把讀取到的內容賦給了x

(1)format

format有2個必須的引數,乙個是輸出位置,如 t 是標準輸出,乙個是輸出內容

**:(format t "hello, world!")

執行結果:hello, world!

(2)print

(print "hello, world!")

(3)write、write-line

(write "hello, world!")

(write-line "hello, world!")

(format t "~a " 10)

執行結果:10

(setf i 10)

(format t "i is: ~a " i)

執行結果:i is: 10

**:(defun outworld() 

(write-line "hello, world!"))

(outworld)

執行結果:hello, world!

(defun myadd(a b)

(+ a b))

(print (myadd 2 3))

在形參列表前面加上&key,相當於傳入的是符號而不是其值,所以用法上有2個差異:

乙個是實參的順序可以變,乙個是引數有預設值nil,可以預設實參。

**一:

(defun mylist (&key a b c)

(list a b c))

(mylist :a 1 :b 2 :c 3)

得到:(1 2 3)

**二:

(mylist :b 2 :c 3 :a 1)

得到:(1 2 3)

**三:

(mylist :b 4)

得到:(nil 4 nil)

**四:

(mylist)

得到:(nil nil nil)

(setf mylist '(1 2 3))

(print (nth 2 mylist))

執行結果:3

nth是取元素,下標從0開始

lisp語言需要區分乙個列表是資料還是**,預設是**,需要解引用才會被視為資料

解引用的常見方式:

(setf mylist '(1 2 3))

(setf mylist (quote(1 2 3)))

(setf mylist (list :a 1 :b 2 :c 3))

(print (getf mylist :a))

屬性表的用法和c++中的map差不多

**:(setf mylist '(1 2 a))

(print (nth 2 mylist))

執行結果:a

**:(setf mylist '(1 2 a))

(setq a "abcd")

(print (eval (nth 2 mylist)))

執行結果:"abcd"

**:(setf mylist '(1 2 a))

(setf b "abcd")

(setf a b)

(print (eval (nth 2 mylist)))

執行結果:"abcd"

(remove-if-not #'evenp '(1 2 3 4 5))

得到: (2 4)

其中evenp是判斷乙個數是不是偶數

(remove-if #'evenp '(1 2 3 4 5))

得到:(1 3 5)

(remove-if-not #'(lambda (x) (= 0 (mod x 2)))  '(1 2 3 4 5))

其中的(lambda (x) (= 0 (mod x 2)))是乙個lambda表示式,含義和evenp一樣,判斷乙個數是不是偶數

(reverse '(1 2 3)

得到:(3 2 1)

(defmacro myreverse(x) (reverse x))

(myreverse ("abcd" t format))

執行結果:abcd

lisp不是函授型語言 LISP語言

拼音 lisp yuyan 外文 lisp 為非數值符號運算而設計的表處理語言。lisp是英文list processing 表處理 的縮寫。lisp語言是1960年j.麥卡錫在遞迴函式論基礎上首先設計出來的。lisp語言的形式化程度高,表達力強,適合於描述各種知識和編寫問題求解的程式,因此一直是用...

Lisp語言 陣列

討論了變數以後讓我們來看看lisp中的陣列,對於非lisp程式設計師來講這是再自然不過的了,很多程式語言的教材上都是在講述了一般性語法後講解陣列。不過,lisp程式設計師可能會有點疑問,為什麼不開始介紹列表呢?列表作為lisp語言的關鍵在lisp中起到了重要的作用,所以很多有關lisp的材料都是以介...

Lisp語言 檔案操作

作為乙個基本功能,檔案操作對於大多數語言來講都是必須支援的,lisp語言和大多數語言一樣提供了檔案操作介面。在lisp中對檔案的操作通過函式open來實現,通過open函式開啟乙個檔案,然後通過read函式讀取檔案內容,或者通過format函式將資料寫入檔案中。函式open的第乙個引數是目標檔案的路...