chiark / gitweb /
src/pset-impl.lisp: Introduce a property type for booleans.
authorMark Wooding <mdw@distorted.org.uk>
Fri, 6 Jul 2018 22:23:45 +0000 (23:23 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Mon, 9 Jul 2018 11:02:05 +0000 (12:02 +0100)
doc/SYMBOLS
src/pset-impl.lisp

index 44d2040997dd9cb7e34e19479e0eff9d77ee1e48..54a38ffb57775e3a4d65637a269e0183e99b932b 100644 (file)
@@ -878,12 +878,15 @@ codegen-push
 codegen-target
   method-codegen
 coerce-property-value
+  cl:integer (eql :int) (eql :boolean)
+  cl:string (eql :id) (eql :boolean)
   cl:string (eql :id) (eql :keyword)
   cl:string (eql :id) (eql :symbol)
   cl:string (eql :id) (eql :type)
   cl:string (eql :string) (eql :id)
   cl:string (eql :string) (eql :keyword)
   cl:string (eql :string) (eql :symbol)
+  cl:symbol (eql :symbol) (eql :boolean)
   cl:symbol (eql :symbol) (eql :id)
   cl:symbol (eql :symbol) (eql :keyword)
   t t (eql cl:t)
index 60674ff8b0a712a43e3a0d1bbaa625925643be7a..e6986a5b91bccf384890ac66d61646534b16505e 100644 (file)
@@ -74,6 +74,14 @@ (defun string-to-symbol
                 (error "Symbol `~A' not external in package `~A'"
                        name (package-name package)))))))))
 
+(let ((truish '("true" "t" "yes" "verily"))
+      (falsish '("false" "nil" "no" "nowise")))
+  (defun truishp (string)
+    "Convert STRING to a boolean."
+    (cond ((member string truish :test #'string=) t)
+         ((member string falsish :test #'string=) nil)
+         (t (error "Unrecognized boolean value `~A'" string)))))
+
 ;;;--------------------------------------------------------------------------
 ;;; Property representation.
 
@@ -114,6 +122,20 @@ (defmethod coerce-property-value
     ((value symbol) (type (eql :symbol)) (wanted (eql :id)))
   (frob-identifier (symbol-name value)))
 
+;;; Boolean.
+
+(defmethod coerce-property-value
+    ((value symbol) (type (eql :symbol)) (wanted (eql :boolean)))
+  value)
+
+(defmethod coerce-property-value
+    ((value string) (type (eql :id)) (wanted (eql :boolean)))
+  (truishp value))
+
+(defmethod coerce-property-value
+    ((value integer) (type (eql :int)) (wanted (eql :boolean)))
+  (not (zerop value)))
+
 ;;; Types.
 
 (defmethod coerce-property-value