2014-11-19 2 views
0

Я пытаюсь создать макрос, который принимает некоторые параметры ключевых слов, и только если параметр определен, добавьте записи в список. Разделив это, следующий код должен показать, что мне нужно.Создание символа ключевого слова

(defun add-if-not-null (var lst) 
    (if (not (null var)) 
     (append (cons (***) (cons ver '())) lst))) 

Эти три звездочки показывают часть, которую я пытаюсь выяснить. Это в основном принимает имя символа и превращает его в представление ключевых слов. например ширина преобразуется: ширина

(let ((width 100)) 
    (add-if-not-null (width '()))) 

Если вернуться

(:width 100) 

Я использую сл-кто, чтобы создать представление SVG и в основном хотят, чтобы установить такие атрибуты, как ширина и высота, если они указаны в качестве параметров к моему макросу, который обертывает документ.

+0

возможно дубликат [Common Lisp Программной Keyword] (http://stackoverflow.com/questions/211717/common-lisp-programmatic-keyword) (заметим, что вы может получить строку '' WIDTH "' из символа 'width' на' (symbol-name 'width) '). –

+0

Также см. [Как создать символ ключевого слова из строки?] (Http://stackoverflow.com/q/24066178/1281433) –

+0

Ни один из них не соответствует законопроекту, как я упоминал ниже. Мне нужно найти способ превратить имя переменной/параметра в параметр ключевого слова. Если мне нужно преобразовать его в строку, как это хорошо. Если вы посмотрите на пример, то ответы до сих пор не дали бы правильного решения. – Sprucial

ответ

2

Название упаковки KEYWORD. Символы создаются (при необходимости) и помещаются в пакет с использованием INTERN.

CL-USER 11 > (intern (symbol-name 'width) "KEYWORD") 
:WIDTH 

Макрос:

CL-USER 29 > (defmacro add-if-not-null (var list) 
       (check-type var symbol) 
       `(when var 
        (push (list ,(intern (symbol-name var) "KEYWORD") var) 
         ,list))) 
ADD-IF-NOT-NULL 

CL-USER 30 > (macroexpand-1 '(add-if-not-null width some-list)) 
(WHEN VAR (PUSH (LIST :WIDTH VAR) SOME-LIST)) 
T 
+0

Это почти то, что мне нужно, но проблема заключается в вызове (символ-имя). Width - это параметр функции, поэтому мне нужно заменить его тем, что вместо этого преобразует имя переменной в строку. Например. Мне нужна (ширина некоторой функции), которая возвращает строку «width» другого вызова, будет (функция any-variable-функция) возвращает «any-variable». У меня есть подозрение, что я делаю это сложнее, чем нужно, но я возвращаюсь к lisp после долгого перерыва. – Sprucial

+0

@Sprucial: см. Мое редактирование. Извините, я хотел добавить его раньше, но отвлекся. Вот оно. Может быть, это то, что вам нужно? –

+0

Спасибо @Rainer Joswig. Это почти то, что мне нужно. Вот что я на самом деле закончил с '' '(defmacro add-if-not-null-macro (var lst) ' (if, var (append, lst (list (intern (symbol-name (quote, var)) «KEYWORD»), var)) , lst)) '' ' – Sprucial

Смежные вопросы