2015-10-15 109 views
-1

列出的int我有一個像「樂趣,ARG1,ARG2」 <線 - 它是一個字符串轉換字符串列表Common Lisp中

我用「」分隔這個字符串分割成字符串列表。然後我將「fun」與一些字符串(例如「Fibonacci」)進行比較。

功能的分裂(正常工作)

(defun split-str (string &optional (r nil)) 
    (let ((n (position "," string 
        :from-end t 
        :test #'(lambda (x y) 
           (find y x :test #'string=))))) 
    (if n 
     (split-str (subseq string 0 n) 
        (cons (subseq string (1+ n)) r)) 
     (cons string r)))) 

測試功能

(defun tmp (a) 
    (if (string= (nth 0 a) "Fibonacci") 
    (progn 
     (setf tab '()) 
     (dolist (n (cdr a)) 
     (cons tab '(parse-integer n))) ; parsing works fine (checked with write) 
     (write tab)) ; always NIL 
      ;(apply #'parse-integer (apply #'values a)) - doesn't work 

    (write "nok"))) 

呼叫:

(tmp (split-str "Fibonacci,15,33")) 

爲什麼我的標籤還沒有2元?

+2

請顯示包含正確拆分的輸出軌跡,並顯示您在選項卡中獲得的內容。有關準則,請參閱http://stackoverflow.com/help/mcve和其他介紹性幫助文檔。 – Prune

+2

請[請正確格式化您的代碼](https://google.github.io/styleguide/lispguide.xml#Formatting)。 – sds

+1

打開你的REPL並輸入'(setf tab'())'''(cons tab 2)','tab'。想想幾分鐘的結果。然後在你的好書中閱讀清單的介紹。 – molbdnilo

回答

0

cons不會改變任何東西;它會使用tab返回一個新列表。

+0

現在我明白了。您能否告訴我如何修改列表(插入新元素)? – kzz

+0

@kzz你可以使用'(push tab(parse-integer n))'。 – PuercoPop

+0

@kzz或'(setf tab(cons(parse-integer n)tab))'(注意,基於'cons''和'push'的方法最終會以'tab'爲結尾的元素,所以你可能希望有一個'(setf選項卡(反向選項卡))'的地方)。 – Vatine