2017-02-18 327 views
-2

我在想這個。 如何檢查列表中的單引號字符串? (不是雙引號字符串) 函數stringp,typecase等等..只處理雙引號。lisp - 單引號字符串入選列表

我想make(f'((3 a)(2 b)(1 c)))應該返回6。 非整數應該被忽略。

我試過這段代碼。

(defun f (lst) 
       (typecase lst 
       (integer (+ (f (first lst)) (f (rest lst)))) 
       (list 0)) 
      ) 

我需要檢查列表中的單引號字符串。 但是,stringp,typecase它不工作,因爲我想要的。

我該怎麼辦才能解決這個問題?

+1

這是一個很好的Lisp介紹:https://www.cs.cmu.edu/~dst/LispBook/它也將解釋符號以及如何使用它們。 –

回答

2

當你寫'((3 a) (2 b) (1 c)),有沒有字符串:沒有單引號的字符串(沒有這樣的事情在Lisp中),沒有雙引號的字符串。你有這樣的價值:

(quote ((3 a) (2 b) (1 c))) 

QUOTE特殊的運算符,防止其子窗體的評價。引用內部的內容是字面常量數據,它被讀取但不被評估。

在這裏,你有列表的列表,它們中的每一個含有數在第一位置,和一個符號作爲第二元件。特別是沒有字符串。

符號是具有名稱(字符串)的對象。每次出現相同的符號x指的是相同的對象。下面在這裏,所有的x指向同一個符號:

((3 x) (2 x) (1 x)) 

在代碼中,你只需要檢查是否存在一個整數,並使用零爲別的:花車,字符串,符號,向量,散列表,CLOS情況下,...

在代碼中的一個大問題是,你檢查變量list(一個不好的名字,因爲你不知道這是否是一個列表)是一個整數,但那麼你繼續採取這個整數的第一個休息:這是保證 失敗!

(defun f (form) 
    (typecase form 

    ;; cons cell: recurse 
    (cons (+ (f (first form)) 
      (f (rest form)))) 

    ;; integer: form is the value 
    (integer form) 

    ;; anything else: zero 
    (t 0))) 

如果您的數據始終遵循相同的模式(夫婦有一個數字,一個符號列表),你可以簡單地遍歷每對,總結數量:

(loop for (number symbol) in list sum number) 

1.在同一package,如果你不非國際的符號。