diff options
| author | Drahflow <drahflow@gmx.de> | 2014-03-11 16:06:17 +0100 |
|---|---|---|
| committer | Drahflow <drahflow@gmx.de> | 2014-03-11 16:06:17 +0100 |
| commit | cb4411da6072cccf0030e5f2c1eb4bbd57a6a14a (patch) | |
| tree | 5cb9d306196654c713730b75d037ed810c80a644 | |
| parent | 0246040cfeb17edb0f81d09faa10c2e6457723e0 (diff) | |
Fixed auto-lambdiaing
| -rw-r--r-- | compiler/standardClient.ey | 77 |
1 files changed, 39 insertions, 38 deletions
diff --git a/compiler/standardClient.ey b/compiler/standardClient.ey index e21ffc0..1d55824 100644 --- a/compiler/standardClient.ey +++ b/compiler/standardClient.ey @@ -1,8 +1,8 @@ ## dynamic member lookup fallback routines { -- 0 } "#.?" deffd -{ "undefined member in .: " -01 cat die } "#." deffd -{ "undefined member in .|: " -01 cat die } "#.|" deffd -{ "undefined member in =: " -01 cat die } "#.=" deffd +{ keys dump "undefined member in .: " -01 cat die } "#." defmd +{ keys dump "undefined member in .|: " -01 cat die } "#.|" defmd +{ keys dump "undefined member in =: " -01 cat die } "#.=" defmd ## regex support # ideas taken from http://swtch.com/~rsc/regexp/regexp3.html @@ -613,29 +613,29 @@ # Run from right (stacktop) argument to left (stacklow) argument: # Take topmost type, check whether it can be found in other stacks (from top) # Eliminate all matching types via function or loop creation - { _ ==?f sys .typed .inputs ==?inputs - [ ] ==?concreteArgs - [ ] ==?viewPortOffset + { _ ==f sys .typed .inputs ==inputs + [ ] ==concreteArgs + [ ] ==viewPortOffset # Phase 1 0 inputs len range reverse { # print "Analyzing arg: %d" - inputs * typeStack ==?formalTypeStack - _ ==?c typeStack ==?concreteTypeStack + inputs * typeStack ==formalTypeStack + _ ==c typeStack ==concreteTypeStack # "Type-Stack: %d" Dumper($concreteTypeStack) die - 0 ==?bestViewPortSize - concreteTypeStack len 1 add ==?bestViewPortMatch + 0 ==bestViewPortSize + concreteTypeStack len 1 add ==bestViewPortMatch # "Formal Type Stack: @$formalTypeStack\n" print # " Type Stack: @$concreteTypeStack\n" print 1 neg concreteTypeStack * isVariableType { - 1 concreteTypeStack len 1 add range { ==?viewPortSize - [ 0 viewPortSize range { concreteTypeStack * } each ] ==?typeViewPort # explicit each here + 1 concreteTypeStack len 1 add range { ==viewPortSize + [ 0 viewPortSize range { concreteTypeStack * } each ] ==typeViewPort # explicit each here # "@$formalTypeStack vs. @$concreteTypeStack\n" print - formalTypeStack concreteTypeStack typeMismatchCount ==?viewPortMatch # FIXME this line seems fishy + formalTypeStack concreteTypeStack typeMismatchCount ==viewPortMatch # FIXME this line seems fishy viewPortMatch bestViewPortMatch lt { viewPortSize =bestViewPortSize viewPortMatch =bestViewPortMatch @@ -665,11 +665,11 @@ # Phase 2, [ - 0 viewPortOffset len range { ==?i - i concreteArgs * typeStack ==?remaining + 0 viewPortOffset len range { ==i + i concreteArgs * typeStack ==remaining [ 0 i viewPortOffset * range { remaining * } each ] # explicit each here } each - ] ==?toBeAbstractedTypes + ] ==toBeAbstractedTypes # "toBeAbstractedTypes: " dump # toBeAbstractedTypes dump @@ -679,26 +679,26 @@ concreteArgs # _ dump _ len dearray f # "attempting to call function (w.o. abstraction)" dump - 0 concreteArgs len range { ==?i + 0 concreteArgs len range { ==i i concreteArgs * sys .typed .type # _ dump i inputs * sys .typed .type # _ dump neq { "invalid input type at argument index " dump i dump "" die } rep } each * } { - [ ] ==?argTypes # the type stack of the new function - [ ] ==?stageCalls # which functions to call in each stage - [ ] ==?loops # undef for lambda abstraction, loop bound source for loops + [ ] ==argTypes # the type stack of the new function + [ ] ==stageCalls # which functions to call in each stage + [ ] ==loops # undef for lambda abstraction, loop bound source for loops - 0 toBeAbstractedTypes len range reverse { ==?i + 0 toBeAbstractedTypes len range reverse { ==i { i toBeAbstractedTypes * len } { # TODO: create a decent shift - [ i toBeAbstractedTypes * reverse _ len dearray ==?type ] reverse i toBeAbstractedTypes =[] - [ i ] ==?stageCalls2 - 1 neg ==?iterationSource + [ i toBeAbstractedTypes * reverse _ len dearray ==type ] reverse i toBeAbstractedTypes =[] + [ i ] ==stageCalls2 + 1 neg ==iterationSource type isIterableType { i =iterationSource } rep - 0 i range reverse { ==?j + 0 i range reverse { ==j j toBeAbstractedTypes * len not not { 0 j toBeAbstractedTypes * * type commonIterationType # -> <type> <any exists> { =type @@ -730,21 +730,21 @@ # "loops: " dump # loops dump - { ==?loops ==?argTypes ==?stageCalls ==?concreteArgs + { ==loops ==argTypes ==stageCalls ==concreteArgs stageCalls len not { concreteArgs _ len dearray f * } { - [ stageCalls _ len dearray ==?stage ] =stageCalls - [ argTypes _ len dearray ==?argType ] =argTypes - [ loops _ len dearray ==?loopIndex ] =loops + [ stageCalls _ len dearray ==stage ] =stageCalls + [ argTypes _ len dearray ==argType ] =argTypes + [ loops _ len dearray ==loopIndex ] =loops loopIndex 0 ge { - [ ] ==?results - loopIndex concreteArgs * ==?loopedOver - loopedOver getLoopStart ==?i + [ ] ==results + loopIndex concreteArgs * ==loopedOver + loopedOver getLoopStart ==i { i loopedOver isLoopEnd not } { - [ concreteArgs _ len dearray ] ==?concreteArgsCopy - stage { ==?j + [ concreteArgs _ len dearray ] ==concreteArgsCopy + stage { ==j # TODO: think about a single function returning multiple values i j concreteArgs * * j concreteArgsCopy =[] } each @@ -762,12 +762,13 @@ # push @$data, [\@results, ['array', '[]', [['range', 0, $#results]], [undef]]]; # FIXME the undef can be determined } { - { ==?v - stage { ==?i - v i concreteArgs * * i concreteArgs =[] + { ==v + [ concreteArgs _ len dearray ] ==concreteArgsCopy + stage { ==i + v i concreteArgs * * i concreteArgsCopy =[] } each - concreteArgs stageCalls argTypes loops unravel + concreteArgsCopy stageCalls argTypes loops unravel } # leave this on the stack # push @$data, [$abstraction, ['func', 'autoabstraction of ' . $f->[1]->[1], [grep { $_ } @argTypeCopy], undef]]; # FIXME the undef can be determined |
