lisp从字符串创建属性列表

时间:2014-09-17 17:55:29

标签: macros plist common-lisp metaprogramming

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)))

但是这种语法被认为是不正确的。

那么你怎么能说我能做到呢?当然,使用可变数量的参数会更好......

提前致谢! 你的, ħ

2 个答案:

答案 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")