2013-12-09 1 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)." 그리고 나서 read-from-string은 읽지 않습니다. 그래서 ...

당신은 어떻게이 구문 분석을 할 수 있습니까?

+1

이 어떻게 부릅니까? CCL은 그런 목록을 허용하지 않습니다. – uselpa

+0

Lisp의 _Recursive 범위에 [내 대답] (http://stackoverflow.com/a/16379759/1281433)을 보면 목록에서 점이 무엇을 의미하는지에 대한 자세한 내용을 보려면 마침표가 _ 추가됩니다. 이름이 문자열''. "'인 기호를 원한다면'|. |'또는'\ .'로 써야합니다. –

+3

당신의 특별한 문제가 아니라 일반적인 해결책에 대해서 :'(100 00 2. 300 00 9)'이 될'102.309'와 같은 숫자를 만들어야한다면 깨지지 않을 것입니다. 마지막으로'12.39'을 생산합니까? –

답변

1

당신의 접근 방식은 특별히 강건 해 보이지 않습니다. 또한 입력 목록이 무엇인지 이해하는 것도 어렵습니다. 점은 |.|과 같은 기호입니까? 수직 막대는 Lisp에서 도트 문자의 내장 된 사용법과 충돌하지 않도록 이름을 이스케이프 처리합니다. 점선 쌍으로 사용되며, 단점 셀을 나타냅니다 : (a . b).

기호 인 경우 문자열로 이스케이프하지 않고 기호를 쓸 수 있습니다. 첫째, 이스케이프와 :

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

다음,없는 :

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

내에서 (100 30 5. 50 (6))의 CL의 유효리스트 구조되지 않고, 코드를 사용 여부

. "점선 쌍"은 점 뒤에 하나의 요소 만 가져야합니다. 더 많은 것을 알고 싶다면 선호하는 Common Lisp Book을 보자. (예 : 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))