2014-09-17 2 views
0

공통 LISP혀짤배기 만드는 속성 목록

여기 내 문제입니다 :

: 나는 헤더 속성 이름되는 PLIST를 반환하는 헤더에서 함수를 csv 파일에서 열을 헤더를 읽고 만들 싶습니다 열 머리글이 "이름", "날짜", "이벤트"인 csv 파일이 있다고합시다. 그래서 더 라인을 읽는 내가 써서

(defun read-csv-line (x y z) 
    (list :Name x :Date y :Event z)) 

: 그 3 문자열에서 내가 좋아하는 함수를 작성하고 싶습니다

:
(read-csv-line "Bob" "1/1/1985" "Birthday") 

내가 매크로 트릭을 할 것이라고 생각
(defmacro convert-to-plist (x y z) 
    `(defun read-csv-line (a b c) 
    (list :,(intern x) a :,(intern y) b :,(intern z) c))) 

하지만이 구문은 올바르지 않은 것으로 간주됩니다.

그럼 어떻게 할 수 있을까요? 다양한 인수를 사용하는 것이 더 좋을 것입니다 ...

미리 감사드립니다! 당신이 무엇을해야

답변

0

시간 :

(defmacro convert-to-plist (x y z) 
    `(defun read-csv-line (a b c) 
    (list ,(intern x "KEYWORD") a 
      ,(intern y "KEYWORD") b 
      ,(intern z "KEYWORD") c))) 

(convert-to-plist "NAME" "DATE" "EVENT")  

(read-csv-line "Bob" "1/1/1985" "Birthday") 

수익률

(:NAME "Bob" :DATE "1/1/1985" :EVENT "Birthday") 
+0

이 그 OP 원형에 충실 유지 defmacro 안에 defun을 가지고 있었지만 실제로는 좋은 형태가 아닌 것 같습니다. –

+0

이 방법은 효과가 있지만 좋은 해결책에서 멀어집니다. 나중에 (''(-to-plist) ''FOO ''BAR ''BAZ ''를 호출하면''read-csv-line''의 정의를 덮어 씁니다. – Vatine

+0

@Vatine 나는이 해결책을 추천하지 않는다. 나는 그의 실수가있는 곳에서만 OP를 보여 주었다. – uselpa

4

방법 대신에 이런 일에 대해 :

CL-USER 34 > (defun make-headers (strings &aux (package "KEYWORD")) 
       (mapcar (lambda (name) 
         (intern (string-upcase name) package)) 
         strings)) 
MAKE-HEADERS 

CL-USER 35 > (defparameter *headers* (make-headers '("Name" "Date" "Event"))) 
*HEADERS* 

CL-USER 36 > (defun read-csv-line (&key (headers *headers*) line) 
       (pairlis headers line)) 
READ-CSV-LINE 

CL-USER 37 > (read-csv-line :line (list "Bob" "1/1/1985" "Birthday")) 
((:EVENT . "Birthday") (:DATE . "1/1/1985") (:NAME . "Bob"))