2013-12-09 62 views
0

我的任務是分析該列表去除管道點在字符串共同口齒不清

(100 30 5 50 6)

與數135.56

輸入列表的格式總是相同的

和我寫道:

(reduce 
    'string-concat 
    (mapcar 
     (lambda (x) (remove #\0 x)) 
     (mapcar 
      'write-to-string 
      l 
     ) 
    ) 
) 

和輸出我有 「135 | | 56。」 然後從字符串中讀取沒有讀取,所以...

你有任何想法我可以做這個解析嗎?

使用或不代碼以上

+1

你怎麼稱呼呢? CCL不允許我有這樣的列表。 – uselpa

+0

看看[我的回答](http://stackoverflow.com/a/16379759/1281433)to _ Lisp的遞歸範圍增加了一個句點?_瞭解更多關於點在列表中的含義。如果你想要一個名稱爲字符串'「。」'的符號,你需要把它寫成'|。''或'\ .'。 –

+3

不是關於你的特定問題,而是關於你的一般解決方案:如果你應該產生一個類似於'102.309'的數字,那麼這個數字就不會被破壞,這將會被輸入'(100 00 2 .300 00 9)',最終產生'12.39'? –

回答

1

您的方法看起來並不健全。此外,它很難理解輸入列表是什麼。點是一個符號,如|.|?垂直條正在逃避名稱,所以它不會與Lisp中的點字符的內置用法相沖突。它用於虛線對,代表單元格:(a . b)

如果它是一個符號,那麼您可以在不轉義字符串的情況下編寫符號。首先,轉義:

CL-USER 5 > (write-to-string '|.|) 
"\\." 

下,無需:

CL-USER 6 > (princ-to-string '|.|) 
"." 
0

你的列表(100 30 5 50 6)不Common Lisp中一個有效列表結構。一個「點對」必須只有一個點後的元素。如果您想了解更多信息,請查看您最喜愛的Common Lisp Book如何從cons單元格構建列表。 (例如Peter Seibels "Practical Common Lisp"

因此,您不能將此字符串解析爲列表,因此您需要執行預處理步驟。

(defun pre-processing (str) 
    (let ((idx (position #\. str))) 
    (list (read-from-string (concatenate 'string (subseq str 0 idx) ")")) 
      (read-from-string (concatenate 'string "(" (subseq str (1+ idx))))))) 

該函數將您的字符串拆分爲兩個列表,您可以按照自己想要的方式進行處理。

CL-USER 1 > (pre-processing "(100 30 5 . 50 6)") 
((100 30 5) (50 6))