Macros lisp从字符串创建属性列表

Macros lisp从字符串创建属性列表,macros,plist,common-lisp,metaprogramming,Macros,Plist,Common Lisp,Metaprogramming,公共口齿不清 这是我的问题:我想从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") 我认为宏可以做到这一

公共口齿不清

这是我的问题:我想从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)))
但这种语法被认为是不正确的

那你怎么说我能做到呢?当然,如果参数数量可变,效果会更好

提前谢谢! 你的, h

这应该可以:

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

不如换成这样:

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

这与OP拥有的原始表单保持一致(defun位于defmacro中),但这看起来并不是一个很好的表单。这是可行的,但远不是一个好的解决方案(首先,调用
(转换为plist“FOO”“BAR”“BAZ”)
稍后将覆盖
读取csv行的定义,这真的很不理想。@Vatine我不赞成这个解决方案,我只是在向OP展示他的错误所在。