From deee127a0e7d1803436033ff40d62f9bdf478c35 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hugo=20H=C3=B6rnquist?= Date: Sat, 9 Jul 2022 23:18:16 +0200 Subject: Extend type-clauses with not. --- doc/ref/guile/util-type.texi | 11 ++++++----- module/c/cpp-environment.scm | 2 +- module/hnh/util/type.scm | 3 ++- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/doc/ref/guile/util-type.texi b/doc/ref/guile/util-type.texi index 104b00b3..d389287e 100644 --- a/doc/ref/guile/util-type.texi +++ b/doc/ref/guile/util-type.texi @@ -22,11 +22,12 @@ into the argument list in the first position: (proc args ...) ⇒ (proc x args ...) @end example -The two primitives @code{and} and @code{or} are also available, which -both take an arbitrary number of predicates, and calls them in order, -with Scheme's usual short-circuiting rules. -@footnote{@code{and} and @code{or} doesn't have to be primitives, but -we would otherwise have one hell of a namespace conflict} +The primitives @code{and}, @code{or}, and @code{not} are also +available, which each take the same number of predicates as schemes +primitives of the same name, and calls them in order, with Scheme's +usual short-circuiting rules. @footnote{These don't have to be +primitives, but we would otherwise have one hell of a namespace +conflict} @defmac list-of variable type-clause Checks if @var{variable} is a list, and that every element satisfies type-clause. diff --git a/module/c/cpp-environment.scm b/module/c/cpp-environment.scm index d6c86f7a..51f16168 100644 --- a/module/c/cpp-environment.scm +++ b/module/c/cpp-environment.scm @@ -77,7 +77,7 @@ (cpp-if-status type: (list-of (memv '(outside active-if inactive-if))) default: '(outside)) (cpp-variables type: hash-table? default: (make-hash-table)) - (cpp-file-stack type: (and ((negate null?)) + (cpp-file-stack type: (and (not null?) (list-of (pair-of string? exact-integer?))) default: '(("*outside*" . 1)))) diff --git a/module/hnh/util/type.scm b/module/hnh/util/type.scm index 800834e5..f35f7839 100644 --- a/module/hnh/util/type.scm +++ b/module/hnh/util/type.scm @@ -22,9 +22,10 @@ ;; DSL for specifying type predicates ;; Basically a procedure body, but the variable to test is implicit. (define-syntax build-validator-body - (syntax-rules (and or list-of) + (syntax-rules (and or not) ((_ variable (and clauses ...)) (and (build-validator-body variable clauses) ...)) ((_ variable (or clauses ...)) (or (build-validator-body variable clauses) ...)) + ((_ variable (not clause)) (not (build-validator-body variable clause))) ((_ variable (proc args ...)) (proc variable args ...)) ((_ variable proc) (proc variable)))) -- cgit v1.2.3