scheme十戒五律
0.1 scheme十戒
0.2 scheme五律
五法 | 內容 |
---|---|
car之法則 | 基本元件car僅定義為針對非空列表(獲取第一個元素) |
cdr之法則 | 基本元件cdr僅定義為針對非空列表,任意非空列表的cdr總是另一個列表 |
cons之法則 | 基本原件cons需要兩個引數, 第二個引數必須是一個列表, 結果是一個列表 |
null? 之法則 | 基本元件null?進定義為針對列表 |
eq?之法則 | 基本元件eq?需要兩個引數, 每個引數都必須是一個非數字的原子 |
Ch1 玩具總動員
名詞解釋:
- atom: 原子
- list: 列表
- collection: 集合
- S表示式: scheme中所以元素都可以叫做S表示式。
1.1 本章基本函式
1.1.1 car函式
def car(lst: List) -> Any:
"""Returns the first item in lst"""
assert isinstance(lst, list), "must provide a list!"
try:
# 嘗試獲取第一個元素
return lst[0]
except IndexError:
# 如果列表是空的,丟擲IndexError
raise IndexError(f"func-car: The provided {lst} is empty")
1.1.2 cdr函式
def cdr(lst: List) -> List:
"""Returns all items in lst after the first one"""
assert isinstance(lst, list), "must provide a list!"
try:
# 跳過第一個元素
return lst[1:]
except IndexError:
# 如果列表元素不足,丟擲IndexError
raise IndexError(f"func-cdr: The provided {lst} has insufficient elements")
1.1.3 cons函式
def cons(item: Any, lst: List) -> List:
"""Returns a new list with car_item as the first element followed by elements of lst"""
assert isinstance(lst, list), "must provide a list!"
try:
# 建立新列表,包含 car_item 和 lst 的元素
return [item] + lst
except TypeError:
# 如果傳入的物件不是列表,丟擲TypeError
raise TypeError(f"func-cons: The provided object {lst} is not a list")
1.1.4 is_null函式
def is_null(lst: List) -> bool:
"""Returns True if lst is empty, False otherwise"""
assert isinstance(lst, list), "must provide a list!"
return not lst
1.1.5 is_atom函式
def is_atom(s: Any) -> bool:
"""Returns True if obj is an 'atomic' type (int, float, str, bool), False otherwise"""
return isinstance(s, (Number, str, bool))
1.1.6 eq函式
def eq(a: Any, b: Any) -> bool:
"""Returns True if a is equal to b, False otherwise"""
assert isinstance(a, (str, bool)), "must provide a no Number atom!"
assert isinstance(b, (str, bool)), "must provide a no Number atom!"
return a == b
1.2 本章內容注意
注意點:
(car l)
是獲取l的第一個元素, 兩端的括號只是代表這是一個過程了- 當
(cdr l)
只返回一個元素時, 要在外面加上一層列表哦
Ch2 處理, 處理, 反覆處理
2.1 本章基本函式
2.1.1 cond函式
2.1.2 lat函式
def lat(lst: List) -> bool:
"""返回列表是否全部由原子組成"""
assert isinstance(lst, list), "must provide a list!"
if is_null(lst): return True
if not is_atom(car(lst)): return False
return lat(cdr(lst))