ошибка типа при передаче struct в макрос в общем lisp - PullRequest
1 голос
/ 11 февраля 2020

У меня есть такая структура:

(defstruct (endpoint (:constructor create-endpoint (name tags values)))
  name tags values)

И этот макрос:

(defmacro build-get-endpoint (server db-uri db endpoint)
  "constructs a get endpoint that returns all records in the measurement"
  (with-gensyms (uri-sym path-sym query-sym route-sym fields)
    `(let ((,fields (cons "time" (append (endpoint-tags ,endpoint)
                                         (endpoint-values ,endpoint))))
           (,uri-sym (quri:uri ,db-uri))
           (,path-sym (format nil "/~a" ,(endpoint-name endpoint)))
           (,query-sym (format nil "SELECT ~{~a~^, ~} FROM ~a"
                               ,fields ,(endpoint-name endpoint))))

       (setf (quri:uri-path ,uri-sym) "/query")
       (setf (quri:uri-query-params ,uri-sym)
             (list (cons "q" ,query-sym) (cons "db" ,db)))

       (define-route ,server ,path-sym :get
         (defview ,route-sym ()
           (vom:debug "sending query (~a) to influx" (quri:render-uri ,uri-sym))
           (call-influx (dex:get ,uri-sym)
                        (:no-error (body &rest args)
                                   (declare (ignore args))
                                   (respond (parse-get-response body)
                                            :type "application/json" :status 200))))))))

Но когда я пытаюсь фактически запустить код через:

(build-get-endpoint server (start-opts-db-uri starts)
                       (start-opts-db-name starts)
                       (create-endpoint "mood" nil '("value")))

Я получаю ошибку типа, которая говорит, что (create-endpoint "mood" nil '("value")) не относится к типу ENDPOINT.

Что я делаю не так?

1 Ответ

6 голосов
/ 11 февраля 2020

См .: ,(endpoint-name endpoint)

Похоже, что оно вычисляет выражение во время макроразложения. endpoint - код, еще не оцененный.

...