習題要求:修改 make-rat,使分母始終為正。若輸入分母為負,同時取分子分母相反數。
; 原版:僅構造序對
(define (make-rat n d) (cons n d))
; 修正版:規範化符號
(define (make-rat n d)
(if (< d 0)
(cons (- n) (- d))
(cons n d)))
Scheme 內建支持有理數,但 SICP 旨在教導如何從零構建抽象層。如同鐵匠師父讓徒弟用鐵錘打鐵錘——不是缺工具,而是練習「構造工具的工具」能力。這是理解編程語言本質的關鍵路徑。
cons 構造序對?cons 是唯一基本數據構造原語cons 連接的兩個值,car 取首,cdr 取尾cons 如「線」,基本數據如「點」,線連點構成任意拓撲make-rat、numer、denom 構成抽象屏障car/cdr 名源自 IBM 704 指令集(Contents of Address/Decrement Register)car/cdr 可以又是序對,形成遞歸定義掌握 cons/car/cdr 即掌握了 Lisp 族語言構建任意數據結構的核心。後續章節將展示如何用序對構建列表、樹、隊列、圖等。