Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/guicho271828/type-i
Type Inference Utility on unary type-checking predicates
https://github.com/guicho271828/type-i
Last synced: 29 days ago
JSON representation
Type Inference Utility on unary type-checking predicates
- Host: GitHub
- URL: https://github.com/guicho271828/type-i
- Owner: guicho271828
- Created: 2015-03-07T03:12:12.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2023-01-27T15:05:30.000Z (almost 2 years ago)
- Last Synced: 2024-10-15T14:10:36.840Z (3 months ago)
- Language: Common Lisp
- Homepage:
- Size: 19.5 KB
- Stars: 4
- Watchers: 3
- Forks: 3
- Open Issues: 3
-
Metadata Files:
- Readme: README.org
Awesome Lists containing this project
README
* Type-I : type-inference from a predicate
This library tries to provide a way to detect what kind of type the given
predicate is trying to check. *This is different from inferring the return
type of a function.* For example,#+BEGIN_SRC lisp
(eq 'null (test-type '(eql nil ?)))
(eq 'string (test-type '(stringp ?)))
#+END_SRC
The inference is done on form basis, and the equivalence of predicates are
determined by =#'equal=. To simplify the design, the argument to check
should be a symbol =?=, exported in package =type-i=.Function =test-type= returns the inferred type. In contrast, =type-tests=
returns a list of all possible test predicates that returns true when =?=
is bound to the object of interest.#+BEGIN_SRC lisp
(is (subset '((TYPEP ? 'integer)
(integerp ?))
(type-tests 'integer)));; more inference on integers, e.g., (< 0 ? 4), should be added
(is (subset '((TYPEP ? '(mod 5))
(TYPEP ? '(integer 0 4)))
(type-tests '(mod 5))))#+END_SRC
This library is extensible. with =define-inference-rule= macro, you can add
more inferers to improve this library. Each inference rule is a unary
function that takes a predicate form, then returns a list of more
forms.The =test-type= searches in the form space, adding the results of each
inference rule, until a form =(typep ? X)= is found (where X is
unknown). If it fails to find such a form even if the maximal set
is obtained, then the =test-type= returns nil. =type-tests= just returns
the maximal set.I currently implemented the following inference rules:
- typep -- =(typep ? 'array)= -> =(arrayp ?)= etc.
- unary -- =(arrayp ?)= -> =(typep ? 'array) (typep ? '(array)) (typep ?
'(array *))= ...
- null -- =(null ?) (typep ? null) (eql ? nil) (eql nil ?) (eq ? nil)= ...
- derived -- call =typexpand=Inference on exhaustive partitions, e.g., =(typep ? 'list)= -> =(typep ?
'(or cons null))= is planned.** Dependencies
This library is at least tested on implementation listed below:
+ SBCL 1.2.8 on X86-64 Linux 3.13.0-46-generic (author's environment)
Also, it depends on the following libraries:
+ Trivia by Masataro Asai ::
NON-Optimized Pattern Matching Library+ alexandria by ::
Alexandria is a collection of portable public domain utilities.+ iterate by ::
Jonathan Amsterdam's iterator/gatherer/accumulator facility+ introspect-environment by Bike ::
Small interface to portable but nonstandard introspection of CL environments.** Author
+ Masataro Asai ([email protected])
* Copyright
Copyright (c) 2015 Masataro Asai ([email protected])
* License
Licensed under the LLGPL License.