src/utils.lisp @ f0f0c180ae1d

Add a REAL janky result extractor

This'll have to get overhauled once we support multi-goal queries, but for now
it'll do the job.
author Steve Losh <steve@stevelosh.com>
date Fri, 15 Apr 2016 22:42:03 +0000
parents 9376531b5089
children 2f0b5c92febe
(in-package #:bones.utils)

(defmacro push-if-new (thing place
                             &environment env
                             &key key (test '#'eql))
  "Push `thing` into the list at `place` if it's not already there.

  Returns whether `thing` was actually pushed.  This function is basically
  `pushnew` except for the return value.

  "
  (multiple-value-bind (temps exprs stores store-expr access-expr)
      (get-setf-expansion place env)
    (declare (ignore stores store-expr))
    (with-gensyms (current result)
      `(let* (,@(zip temps exprs)
              (,current ,access-expr)
              (,result (pushnew ,thing ,place :key ,key :test ,test)))
        (not (eql ,current ,result))))))