Schemer學習

xxl404發表於2024-10-09

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))

2.2 本章內容注意

相關文章