Test Suite for Pail
===================
<!--
Copyright (c) 2011-2024, Chris Pressey, Cat's Eye Technologies.
SPDX-License-Identifier: LicenseRef-BSD-2-Clause-X-Pail
-->
This test suite is written in the format of Falderal 0.7. It is far from
exhaustive, but provides a basic sanity check that the language I've designed
here comes close to what I had in mind.
Pail Tests
----------
-> Tests for functionality "Evaluate Pail Expression"
A symbol reduces to that symbol.
| fst
= fst
| plains-of-leng?
= plains-of-leng?
A symbol must begin with a letter and contain only letters, digits,
hyphens, and question marks.
| ^hey
= %(line 1, column 1):
= unexpected "^"
= expecting white space, "*", "#", "[" or letter
A pair reduces to that pair.
| [a b]
= [a b]
| [fst [a b]]
= [fst [a b]]
| [*fst [a b]]
= [*fst [a b]]
Square brackets must be properly matched.
| [a b
= %(line 1, column 5):
= unexpected end of input
= expecting letter or digit, "-", "?", "_", white space or "]"
Evaluation of a symbol reduces to that to which it is bound.
| *fst
= <fst>
Evaluation of a pair recursively reduces its contents.
| *[*fst [a b]]
= [<fst> [a b]]
| *[*fst *snd]
= [<fst> <snd>]
| *[*fst *[*snd *fst]]
= [<fst> [<snd> <fst>]]
Evaluation of a pair w/a fun on the lhs applies the fun.
| **[*fst [a b]]
= a
| **[*snd [a b]]
= b
Reducing an evaluation of a pair can accomplish a cons.
| *[**[*fst [a b]] **[*snd [c d]]]
= [a d]
Reducing on the lhs of a pair can obtain a fun to apply.
| **[**[*fst [*snd *fst]] [a b]]
= b
Applying uneval reduces to an evaluation.
| **[*uneval hello]
= *hello
The form `#x` is syntactic sugar for `**[*uneval x]`.
| #hello
= *hello
Syntactic sugar is expanded at parse time.
| [#fst [a b]]
= [**[*uneval fst] [a b]]
It is possible to uneval a fun.
| #*fst
= *<fst>
Reduction of an uneval'ed symbol can be used to obtain an eval'ed symbol.
| *[#fst [a b]]
= [*fst [a b]]
Reduction of uneval'ed symbol can be used to obtain a fun.
| **[#fst [a b]]
= [<fst> [a b]]
Reduction of uneval'ed symbol can be used to apply the obtained fun.
| ***[#fst [a b]]
= a
Positive test of `if-equal?` on symbols.
| **[*if-equal? [[a a] [one two]]]
= one
Negative test of `if-equal?` on symbols.
| **[*if-equal? [[a b] [one two]]]
= two
Negative test of `if-equal?` on evals.
| ***[*if-equal? [[*a *b] [fst snd]]]
= <snd>
Let can bind a symbol to a symbol.
| **[*let [[a b] *a]]
= b
Let can bind a symbol to a pair.
| **[*let [[g [x y]] **[*snd *g]]]
= y
Let can bind a symbol to an expression containing an uneval,
which can at a later point be eval'ed and reduced.
| **[*let [
| [sndg *[**[*uneval snd] **[*uneval g]]]
| **[*let [
| [g [x y]]
| ***sndg
| ]]
| ]]
= y
| **[*let [
| [cadrg *[#fst ##*[#snd #g]]]
| **[*let [
| [g [x [y z]]]
| ***cadrg
| ]]
| ]]
= y
Let can bind uneval'ed expression; prior bindings are honoured.
| **[*let [
| [g moo]
| **[*let [
| [consnull *[#g null]]
| ***consnull
| ]]
| ]]
= [moo null]
Let can bind uneval'ed expression; prior bindings are shadowed.
| **[*let [
| [g moo]
| **[*let [
| [consnull *[#g null]]
| **[*let [
| [g k]
| ***consnull
| ]]
| ]]
| ]]
= [k null]