Mike Gerwitz

Activist for User Freedom

aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMike Gerwitz <mike.gerwitz@rtspecialty.com>2018-03-16 16:18:30 -0400
committerMike Gerwitz <mike.gerwitz@rtspecialty.com>2018-09-11 09:30:53 -0400
commit1b0da8c870dd90e431e85433f3b8a453b11be343 (patch)
tree69cf7b80af436eda536393da6d745a99633db74d
parentb615c2be32eaba22668f8265dc99dd5d71fa5622 (diff)
downloadtame-1b0da8c870dd90e431e85433f3b8a453b11be343.tar.gz
tame-1b0da8c870dd90e431e85433f3b8a453b11be343.tar.bz2
tame-1b0da8c870dd90e431e85433f3b8a453b11be343.zip
symbol: Add package
* symbol.xml: New package. * test/core/suite.xml: Import new symbol package. * test/core/symbol.xml: New test spec.
-rw-r--r--core/symbol.xml92
-rw-r--r--core/test/core/suite.xml1
-rw-r--r--core/test/core/symbol.xml171
3 files changed, 264 insertions, 0 deletions
diff --git a/core/symbol.xml b/core/symbol.xml
new file mode 100644
index 0000000..bef7e17
--- /dev/null
+++ b/core/symbol.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0"?>
+<!--
+ Copyright (C) 2018 R-T Specialty, LLC.
+
+ This file is part of tame-core.
+
+ tame-core is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<package xmlns="http://www.lovullo.com/rater"
+ xmlns:c="http://www.lovullo.com/calc"
+ xmlns:t="http://www.lovullo.com/rater/apply-template"
+ core="true"
+ desc="Symbol Introspection">
+
+ TAME provides powerful symbol table introspection features to assist
+ with metaprogramming.
+ This package provides templates to abstract some of those features and
+ make them easier to use.
+
+ If introspecting on symbols that are defined within the same package,
+ be aware that the symbols may not be available until a future pass;
+ \tt{expand-sequence} may be helpful in that situation.
+
+
+ \ref{_if-symbol_} is a general-purpose template to conditionally expand a
+ body if a symbol matches a given predicate.
+ The predicates currently supported are \tt{type} and \tt{dim}.
+ If no predicate is provided,
+ then the body will be expanded if the symbol exists.\footnote{
+ This is equivalent to \tt{type=""}.}
+
+ <template name="_if-symbol_"
+ desc="Expand body if symbol predicate matches">
+ <param name="@values@" desc="Condition body" />
+ <param name="@name@" desc="Symbol name" />
+ <param name="@type@" desc="Symbol type predicate" />
+ <param name="@dim@" desc="Symbol dimensions predicate" />
+
+ <param name="@_sym_type@" desc="Symbol type lookup">
+ <param-sym-value name="@name@" value="type" ignore-missing="true" />
+ </param>
+ <param name="@_sym_dim@" desc="Symbol dimensions lookup">
+ <param-sym-value name="@name@" value="dim" ignore-missing="true" />
+ </param>
+
+
+ <if name="@type@">
+ <if name="@_sym_type@" eq="@type@">
+ <param-copy name="@values@" />
+ </if>
+ </if>
+ <unless name="@type@">
+ <if name="@dim@">
+ <if name="@_sym_dim@" eq="@dim@">
+ <param-copy name="@values@" />
+ </if>
+ </if>
+
+ <!-- default simply checks to see if the symbol exists -->
+ <unless name="@dim@">
+ <unless name="@_sym_type@" eq="">
+ <param-copy name="@values@" />
+ </unless>
+ </unless>
+ </unless>
+ </template>
+
+
+ \ref{_if-defined_} is the same as \ref{_if-symbol_} with no predicates;
+ it provides more comfortable terminology for a common use case.
+
+ <template name="_if-defined_"
+ desc="Expand body if symbol is defined">
+ <param name="@values@" desc="Condition body" />
+ <param name="@name@" desc="Symbol name" />
+
+ <t:if-symbol name="@name@">
+ <param-copy name="@values@" />
+ </t:if-symbol>
+ </template>
+</package>
diff --git a/core/test/core/suite.xml b/core/test/core/suite.xml
index afa3cf9..f64aed6 100644
--- a/core/test/core/suite.xml
+++ b/core/test/core/suite.xml
@@ -37,6 +37,7 @@
<import package="aggregate" />
<import package="insurance" />
+ <import package="symbol" />
<import package="tplgen" />
<!-- XXX broken!
diff --git a/core/test/core/symbol.xml b/core/test/core/symbol.xml
new file mode 100644
index 0000000..11347b0
--- /dev/null
+++ b/core/test/core/symbol.xml
@@ -0,0 +1,171 @@
+<?xml version="1.0"?>
+<!--
+ Copyright (C) 2018 R-T Specialty, LLC.
+
+ This file is part of tame-core.
+
+ tame-core is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as
+ published by the Free Software Foundation, either version 3 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+<package xmlns="http://www.lovullo.com/rater"
+ xmlns:c="http://www.lovullo.com/calc"
+ xmlns:t="http://www.lovullo.com/rater/apply-template"
+ desc="Vector Folding and Unfolding Specs">
+
+ <import package="../spec" />
+
+ <import package="../../vector/stub" />
+ <import package="../../base" />
+ <import package="../../symbol" />
+
+
+ <t:describe name="_if-symbol_">
+ <t:describe name="given no predicate">
+ <t:it desc="expands body if symbol is defined">
+ <t:given>
+ <c:sum>
+ <t:if-symbol name="TRUE">
+ <c:value-of name="TRUE" />
+ </t:if-symbol>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="TRUE" />
+ </t:expect>
+ </t:it>
+
+
+ <t:it desc="does not expand body if symbol is undefined">
+ <t:given>
+ <c:sum>
+ <t:if-symbol name="UNDEFINED">
+ <c:value-of name="TRUE" />
+ </t:if-symbol>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="FALSE" />
+ </t:expect>
+ </t:it>
+ </t:describe>
+
+
+ <t:describe name="given type predicate">
+ <t:it desc="expands body if symbol is of given type">
+ <t:given>
+ <c:sum>
+ <t:if-symbol name="TRUE" type="const">
+ <c:value-of name="TRUE" />
+ </t:if-symbol>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="TRUE" />
+ </t:expect>
+ </t:it>
+
+
+ <t:it desc="does not expand body if symbol is not of given type">
+ <t:given>
+ <c:sum>
+ <t:if-symbol name="TRUE" type="class">
+ <c:value-of name="TRUE" />
+ </t:if-symbol>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="FALSE" />
+ </t:expect>
+ </t:it>
+ </t:describe>
+
+
+ <t:describe name="given dim predicate">
+ <t:it desc="expands body if symbol dimenions matches">
+ <t:given>
+ <c:sum>
+ <t:if-symbol name="NVEC1" dim="1">
+ <c:value-of name="TRUE" />
+ </t:if-symbol>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="TRUE" />
+ </t:expect>
+ </t:it>
+
+
+ <t:it desc="does not expand body if symbol does match dimensions">
+ <t:given>
+ <c:sum>
+ <t:if-symbol name="NVEC1" dim="2">
+ <c:value-of name="TRUE" />
+ </t:if-symbol>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="FALSE" />
+ </t:expect>
+ </t:it>
+ </t:describe>
+ </t:describe>
+
+
+ <!-- this duplicates the above _if-symbol_ portion -->
+ <t:describe name="_if-defined_">
+ <t:describe name="given no predicate">
+ <t:it desc="expands body if symbol is defined">
+ <t:given>
+ <c:sum>
+ <t:if-defined name="TRUE">
+ <c:value-of name="TRUE" />
+ </t:if-defined>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="TRUE" />
+ </t:expect>
+ </t:it>
+
+
+ <t:it desc="does not expand body if symbol is undefined">
+ <t:given>
+ <c:sum>
+ <t:if-defined name="UNDEFINED">
+ <c:value-of name="TRUE" />
+ </t:if-defined>
+ <c:value-of name="FALSE" />
+ </c:sum>
+ </t:given>
+
+ <t:expect>
+ <t:match-result value="FALSE" />
+ </t:expect>
+ </t:it>
+ </t:describe>
+ </t:describe>
+</package>