Lisp - 運算子



運算子是一個符號,它告訴編譯器執行特定的數學或邏輯操作。LISP 允許對資料進行大量操作,並由各種函式、宏和其他構造支援。

允許對資料進行的操作可以歸類為:

  • 算術運算
  • 比較運算
  • 邏輯運算
  • 按位運算

算術運算

下表顯示了 LISP 支援的所有算術運算子。假設變數A儲存 10,變數B儲存 20,則:

顯示示例

運算子 描述 示例
+ 將兩個運算元相加 (+A B) 將得到 30
- 從第一個運算元中減去第二個運算元 (- A B) 將得到 -10
* 將兩個運算元相乘 (* A B) 將得到 200
/ 將分子除以分母 (/ B A) 將得到 2
mod,rem 模運算子和整數除法後的餘數 (mod B A )將得到 0
incf 增量運算子將整數值增加指定第二個引數 (incf A 3) 將得到 13
decf 減量運算子將整數值減少指定第二個引數 (decf A 4) 將得到 9

比較運算

下表顯示了 LISP 支援的所有關係運算符,它們比較數字之間的大小。但是,與其他語言中的關係運算符不同,LISP 比較運算子可以接受兩個以上的運算元,並且它們僅適用於數字。

假設變數A儲存 10,變數B儲存 20,則:

顯示示例

運算子 描述 示例
= 檢查運算元的值是否都相等,如果相等,則條件為真。 (= A B) 為假。
/= 檢查運算元的值是否都不相等,如果值不相等,則條件為真。 (/= A B) 為真。
> 檢查運算元的值是否單調遞減。 (> A B) 為假。
< 檢查運算元的值是否單調遞增。 (< A B) 為真。
>= 檢查任何左側運算元的值是否大於或等於下一個右側運算元的值,如果大於或等於,則條件為真。 (>= A B) 為假。
<= 檢查任何左側運算元的值是否小於或等於其右側運算元的值,如果小於或等於,則條件為真。 (<= A B) 為真。
max 它比較兩個或多個引數,並返回最大值。 (max A B) 返回 20
min 它比較兩個或多個引數,並返回最小值。 (min A B) 返回 10

布林值上的邏輯運算

Common LISP 提供三個邏輯運算子:and、ornot,它們對布林值進行操作。假設A的值為 nil,B的值為 5,則:

顯示示例

運算子 描述 示例
and 它接受任意數量的引數。引數從左到右求值。如果所有引數都求值為非 nil,則返回最後一個引數的值。否則返回 nil。 (and A B) 將返回 NIL。
or 它接受任意數量的引數。引數從左到右求值,直到一個引數求值為非 nil,在這種情況下,返回該引數的值,否則返回nil (or A B) 將返回 5。
not 它接受一個引數,如果引數求值為nil,則返回t (not A) 將返回 T。

數字上的按位運算

按位運算子作用於位,並執行逐位運算。按位與、或和異或運算的真值表如下所示:

顯示示例

p q p and q p or q p xor q
0 0 0 0 0
0 1 0 1 1
1 1 1 1 0
1 0 0 1 1
Assume if A = 60; and B = 13; now in binary format they will be as follows:
A = 0011 1100
B = 0000 1101
-----------------
A and B = 0000 1100
A or B = 0011 1101
A xor B = 0011 0001
not A  = 1100 0011

LISP 支援的按位運算子列在下表中。假設變數A儲存 60,變數B儲存 13,則:

運算子 描述 示例
logand 這將返回其引數的按位邏輯與。如果沒有給出引數,則結果為 -1,這是此運算的單位元。 (logand a b)) 將得到 12
logior 這將返回其引數的按位邏輯包含或。如果沒有給出引數,則結果為零,這是此運算的單位元。 (logior a b) 將得到 61
logxor 這將返回其引數的按位邏輯異或。如果沒有給出引數,則結果為零,這是此運算的單位元。 (logxor a b) 將得到 49
lognor 這將返回其引數的按位非。如果沒有給出引數,則結果為 -1,這是此運算的單位元。 (lognor a b) 將得到 -62,
logeqv 這將返回其引數的按位邏輯等價(也稱為異或非)。如果沒有給出引數,則結果為 -1,這是此運算的單位元。 (logeqv a b) 將得到 -50
廣告