diff options
author | David Robillard <d@drobilla.net> | 2009-10-16 03:20:22 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2009-10-16 03:20:22 +0000 |
commit | 195598d60fec7a9ea2096143d853fab8232b5138 (patch) | |
tree | a768c19d5b59db09df0b6ee52e2ee6e1fb8a0ba0 /src/constrain.cpp | |
parent | c2d75892af2fdc6b9bf25365a15de5dc63bcc852 (diff) | |
download | resp-195598d60fec7a9ea2096143d853fab8232b5138.tar.gz resp-195598d60fec7a9ea2096143d853fab8232b5138.tar.bz2 resp-195598d60fec7a9ea2096143d853fab8232b5138.zip |
. operator for destructuring Tuples (cons).
git-svn-id: http://svn.drobilla.net/resp/tuplr@236 ad02d1e2-f140-0410-9f75-f8b11f17cedd
Diffstat (limited to 'src/constrain.cpp')
-rw-r--r-- | src/constrain.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/src/constrain.cpp b/src/constrain.cpp index b7d7a0d..36a82d1 100644 --- a/src/constrain.cpp +++ b/src/constrain.cpp @@ -185,6 +185,27 @@ ACons::constrain(TEnv& tenv, Constraints& c) const } void +ADot::constrain(TEnv& tenv, Constraints& c) const +{ + THROW_IF(size() != 3, loc, "`.' requires exactly 2 arguments"); + const_iterator i = begin(); + AST* obj = *++i; + ALiteral<int32_t>* idx = (*++i)->to<ALiteral<int32_t>*>(); + THROW_IF(!idx, loc, "the 2nd argument to `.' must be a literal integer"); + obj->constrain(tenv, c); + + AType* retT = tenv.var(this); + c.constrain(tenv, this, retT); + + AType* objT = tup<AType>(loc, tenv.Tup, 0); + for (int i = 0; i < idx->val; ++i) + objT->push_back(tenv.var()); + objT->push_back(retT); + objT->push_back(tenv.ellipses); + c.constrain(tenv, obj, objT); +} + +void APrimitive::constrain(TEnv& tenv, Constraints& c) const { const string n = head()->to<const ASymbol*>()->str(); |