src/wam/ui.lisp @ 53d629a6aa69

Add done-thunk and use it for query interaction

Also adds `fact` convenience wrappers.
author Steve Losh <steve@stevelosh.com>
date Fri, 22 Apr 2016 13:27:41 +0000
parents 1ab41e0128dc
children 678ab674bd33
(in-package #:bones.wam)


(defparameter *database* nil)

(defmacro with-database (&body body)
  `(let ((*database* (make-wam)))
     ,@body))


(defun add-rules (rules)
  (compile-rules *database* rules))


(defmacro rule (&body body)
  `(add-rules '(,body)))

(defmacro fact (&body body)
  `(add-rules '(,body)))

(defmacro rules (&body rules)
  `(add-rules ',rules))

(defmacro facts (&body rules)
  `(add-rules ',(mapcar #'list rules)))


(defun display-results (results)
  (format t "~%")
  (loop :for (var . result) :in results :do
        (format t "~S = ~S~%" var result)))

(defun result-one (results)
  (display-results results)
  t)

(defun result-all (results)
  (display-results results)
  nil)

(defun result-interactive (results)
  (display-results results)
  (format t "~%More? [Yn] ")
  (force-output)
  (switch ((read-line) :test #'string=)
    ("y" nil)
    ("" nil)
    ("n" t)
    (t t)))


(defun perform-query (query mode)
  (run-query *database* query
             (ecase mode
               (:interactive #'result-interactive)
               (:all #'result-all)
               (:one #'result-one))))


(defmacro query (&body body)
  `(perform-query ',body :interactive))

(defmacro query-all (&body body)
  `(perform-query ',body :all))

(defmacro query-one (&body body)
  `(perform-query ',body :one))


(defun dump (&optional full-code)
  (dump-wam-full *database*)
  (when full-code
    (dump-wam-code *database*)))