2015-06-14 2 views
1

Я написал код для управления базой данных postgresql и работает на консоли. Теперь я хочу поместить его в свою внутреннюю сеть через hunchentoot.Обработчик Hunchentoot изменяет определение другой функции

Я использую clsql и упакованный код базы данных, как:

(defpackage :my-database 
    (:use :common-lisp) 
    (:documentation "several lines...") 
    (:export almost-all-functions...)) 

(in-package #:my-database) 

(defun new-patient (name gender height weight) 
    "adds new patient to the db. all parameters are of type string." 
    (let* ((height (parse-integer height)) 
     (weight (parse-integer weight)) 
     (corrected-weight (calculate-corrected-weight height weight gender))) 
    (clsql:insert-records :into 'patients 
          :attributes '(height weight corrected-weight name gender patient-at-ward) 
         :values (list height weight corrected-weight name gender t)))) 

Я импортировал пакет моих-баз данных, и, когда я использую этот обработчик:

(define-easy-handler (debug :uri "/debug") 
    (name gender height weight) 
    (let ((ad (substitute #\space #\+ (string-trim " " ad)))) 
    (progn (format nil "Name:~A, Gender:~A, Height:~A, Weight:~A" name gender height weight) 
      (redirect "/success")))) 

Он отображает HTML просто отлично. Но этот обработчик:

(define-easy-handler (new-patient :uri "/new-patient") 
    (name gender height weight) 
    (let ((name (substitute #\space #\+ (string-trim " " name)))) 
    (progn (my-database:new-patient name gender height weight) 
      (redirect "/success")))) 

выдает ошибку:

Incorrect keyword arguments in ("Frank Sinatra" "male" "150" "55") 

Я заметил, что когда я печатаю (my-database:new-patient) в РЕПЛ, Emacs команды минибуфера показывает (my-database:new-patient &key name gender height weight). Часть &key выглядела подозрительной для меня. Поэтому я переключился на файл моей базы данных, сделал slime-eval-last-expression-in-repl, который исправил отображение минибауэра команды emacs.

Но на этот раз, я получил следующее сообщение об ошибке:

Too few arguments in call to #<Compiled-function MY-DATABASE:NEW-PATIENT #x15870D76>: 
0 arguments provided, at least 4 required. 

И пересматривает обработчик Hunchentoot вызывается команда Emacs Минибуфера, чтобы показать ключ & снова. Наконец, я изменил код обработчика для (my-database:new-patient :name name :gender gender :height height :weight weight), который выдает эту ошибку:

8 arguments were provided, but at most 4 are accepted by the current global 
definition of NEW-PATIENT 

Что может быть причиной?

+1

Примечания что вам не нужно 'progn' внутри' let'form. –

ответ

2

Причина заключается в том, что семантика define-easy-handler:

The resulting handler will be a Lisp function with the name name and keyword parameters named by the var symbols.

(согласно документации Hunchentoot: http://weitz.de/hunchentoot/), так что вы должны использовать другое имя для обработчика, например:

(define-easy-handler (do-new-patient :uri "/new-patient") 
    (name gender height weight) 
(let ((name (substitute #\space #\+ (string-trim " " name)))) 
    (progn (my-database:new-patient name gender height weight) 
     (redirect "/success")))) 
Смежные вопросы