mapcar 允許您在列表中的每個元素上執行一個“功能”

  • Share this:

;---------------------------------------

(setq a 5)

( mapcar '1+ (list a))

; 傳回 6

;---------------------------------------

(setq a '(1 2 3 4 5 6 7 8)) ( mapcar '1+ a) ;這會傳回:

; (2 3 4 5 6 7 8 9)

;----------------------------------------

假設說你有存儲在變數 arglist 中數據的列表。

(setq alist '(2.0 14.8 6.2 "M10"))

要放置的每個項目在列表中它自己的變數在你的例程使用。

做到這一點的一種方法是如下:

(setq a (nth 0 alist))

(setq b (nth 1 alist))

(setq c (nth 2 alist))

(setq d (nth 3 alist))

這樣可以工作,但處理數據時,每個變量需要一個程序語句,是一個極其緩慢的方式。

一個更有效的方法是使用MAPCAR技術。

(mapcar 'set '(a b c d) alist)

;----------------------------------------------------------------------------------------

如果你是從外部文件中讀取一個列表,

你的程序可能無法讀回列表中的元素,即使他們曾經是。

你的程序將讀回的字符串。例如:

您的列表應該看起來像這樣:

(10 30 50)

但是從文件中讀取列表中後,它看起來像這樣:

("10" "30" "50")

您可以使用(mapcar)到列表中轉換字符串到整數:

( setq b ( mapcar '( atoi ) thelist ))

;------------------------------------------------------------------------------------------

如果您使用的是AutoLISP函數,但你會如何使用(mapcar)與用戶定義的函數?

讓我們來看看這個例子:

我們有要轉換為弧度角度的清單。

(setq c '(22.5 45.0 60.0 75.5))

首先,我們會寫一個函數把角度轉換為弧度:

(defun dtr (a) (* pi (/ a 180.0)) )

我們的函數來轉換我們的名單看起來就像這樣:

( setq d ( mapcar 'dtr c))

此功能將對表C中的每個元素運行(DTR)函數。

換句話說,每個元件的值被傳遞到(DTR)的功能。

該功能也可以這樣寫:

( setq d ( mapcar ( quote dtr) c))


Tags: