Я написал код для управления базой данных 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
Что может быть причиной?
Примечания что вам не нужно 'progn' внутри' let'form. –