Common LISP
这是我的问题:我想从csv文件中读取列标题,并从这些标题创建一个返回plist的函数,其中标题是属性名称:
我们假设我们有一个csv文件,其列标题为"名称","日期","事件"。 从这3个字符串我想创建一个像:
这样的函数(defun read-csv-line (x y z)
(list :Name x :Date y :Event z))
以便进一步阅读我写道:
(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 :(得分: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"))
答案 1 :(得分:2)
这应该做:
(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")