映射是指把函式套用到序列的每個元素上,產生一個新的序列。
用 mapcar 這個函式就能輕鬆地對陣列做到這件事。
假設我們有一個 double 函式,它會把引數乘以 2:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
注意第一個引數是要呼叫的函式。#' 是一種特殊的引號語法,用來指定函式。
double 會先以第一個元素呼叫,然後是第二個,依此類推。
這些結果會收集成一個陣列,也就是這個運算式求值後的值。
過濾是指從一個序列產生另一個序列的過程,作法是複製原始序列中除了某些元素之外的所有元素。 至於新序列要包含哪些項目,可以透過述詞函式(一種求值結果為布林值的函式)來決定,也可以依據與特定物件是否相等來決定。
remove-if 這個函式接受一個述詞函式和一個序列做為引數,並回傳一個只包含述詞求值為 false 之元素的序列。
換句話說,它會「移除」序列中所有讓述詞求值為 true 的元素。不過要注意,這個函式不會修改原始序列!
而是回傳一個不包含這些元素的新序列。如果述詞對所有值都求值為 true,就會回傳一個空序列。
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
如果想從序列中移除某個特定項目,可以使用 remove,它接受要移除的項目和一個序列。
序列中所有不等於要移除項目的值都會被回傳。
注意:預設會用 eql 這個通用相等性述詞來檢查相等性。
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
Lisp 外星人 Lucy 喜歡數字,他們覺得其中有些數字很「了不起」。
他們想請你幫忙寫一些函式,讓數字變得更了不起。
Lucy 對「數字怎樣才算了不起」的看法會改變,所以這些函式必須保持彈性。
想把一個數字陣列變成更了不起的數字陣列,你需要寫一個函式 make-magnificent-maybe,它接受一個要套用到數字上的函式,以及一個數字陣列。
它應該求值為一個數字陣列,裡面的數字都更了不起(依據你提供的函式而定)。
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
在(希望有)把數字變得更了不起之後,Lucy 只想看看真正了不起的數字。
他們很確定 1 永遠不了不起,所以你得把 1 拿掉。
除此之外,Lucy 有時會改變心意,所以他們同樣會給你一個函式,用來判斷某個數字了不起還是不了不起。
你需要寫一個函式 only-the-best,它接受一個函式和一個數字陣列,只回傳最棒的數字(不包括 1,也不包括函式求值為 true 的數字)。
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()