operator sections
This commit is contained in:
4
TODO.md
4
TODO.md
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
## TODO
|
## TODO
|
||||||
|
|
||||||
- [ ] change "in prefix position" and "trailing operator" errors to do sections
|
- [x] change "in prefix position" and "trailing operator" errors to do sections
|
||||||
- [ ] maybe add fat arrows, I keep wanting to type them, `{{...}}` is a little ugly
|
- [ ] maybe add fat arrows, I keep wanting to type them, `{{...}}` is a little ugly
|
||||||
- There may be ambiguity issues at the parsing level, but we don't have typecase, so...
|
- There may be ambiguity issues at the parsing level, but we don't have typecase, so...
|
||||||
- [x] get some names on add missing cases (if not too difficult)
|
- [x] get some names on add missing cases (if not too difficult)
|
||||||
@@ -211,7 +211,7 @@
|
|||||||
- Makes inference easier, cleaner output, and allows `foo $ \ x => ...`
|
- Makes inference easier, cleaner output, and allows `foo $ \ x => ...`
|
||||||
- [ ] `$` no longer works inside ≡⟨ ⟩ - sort out how to support both that and `$ \ x => ...` (or don't bother)
|
- [ ] `$` no longer works inside ≡⟨ ⟩ - sort out how to support both that and `$ \ x => ...` (or don't bother)
|
||||||
- We'd either need to blacklist all non-initial mixfix bits at the appropriate spots or always pass around a terminating token.
|
- We'd either need to blacklist all non-initial mixfix bits at the appropriate spots or always pass around a terminating token.
|
||||||
- I'm leaning towards _no_ here, because I may want to lift mixfix processing out of the parsing step in the future. This isn't
|
- I'm leaning towards _no_ here, because I may want to lift mixfix processing out of the parsing step in the future.
|
||||||
- [x] **Translate newt to newt**
|
- [x] **Translate newt to newt**
|
||||||
- [x] Support @ on the LHS
|
- [x] Support @ on the LHS
|
||||||
- [x] if / then / else sugar
|
- [x] if / then / else sugar
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ for fn in tests/*.newt ; do
|
|||||||
fi
|
fi
|
||||||
# if there is a golden file, run the code and compare output
|
# if there is a golden file, run the code and compare output
|
||||||
if [ -f ${fn}.golden ]; then
|
if [ -f ${fn}.golden ]; then
|
||||||
bun run out.js > tmp/${bn}.out
|
node out.js > tmp/${bn}.out
|
||||||
if [ $? != "0" ]; then
|
if [ $? != "0" ]; then
|
||||||
echo Run failed for $fn
|
echo Run failed for $fn
|
||||||
failed=$((failed + 1))
|
failed=$((failed + 1))
|
||||||
|
|||||||
@@ -219,7 +219,11 @@ pratt ops prec stop left spine = do
|
|||||||
((_, fc, right) :: rest) => do
|
((_, fc, right) :: rest) => do
|
||||||
(right, rest) <- pratt ops pr stop right rest
|
(right, rest) <- pratt ops pr stop right rest
|
||||||
pratt ops prec stop (RApp (getFC left + getFC right) left right Explicit) rest
|
pratt ops prec stop (RApp (getFC left + getFC right) left right Explicit) rest
|
||||||
_ => fail "trailing operator"
|
_ =>
|
||||||
|
-- Trailing operator section, like (2 +)
|
||||||
|
pratt ops prec stop left Nil
|
||||||
|
-- fail "trailing operator"
|
||||||
|
|
||||||
|
|
||||||
runRule p fix stop (nm :: rule) left spine = do
|
runRule p fix stop (nm :: rule) left spine = do
|
||||||
case spine of
|
case spine of
|
||||||
@@ -240,8 +244,10 @@ pratt ops prec stop left spine = do
|
|||||||
-- TODO False should be an error here
|
-- TODO False should be an error here
|
||||||
Just (MkOp name p fix True rule) => do
|
Just (MkOp name p fix True rule) => do
|
||||||
runRule p fix stop rule (RVar fc name) spine
|
runRule p fix stop rule (RVar fc name) spine
|
||||||
Just (MkOp name p fix False rule) => do
|
Just (MkOp name p fix False rule) =>
|
||||||
fail "got infix \{show name} in prefix position"
|
-- REVIEW We could also use a lambda with a fresh name
|
||||||
|
runRule p fix stop rule (RApp fc (RVar fc "flip") (RVar fc name) Explicit) spine
|
||||||
|
-- fail "got infix \{show name} in prefix position"
|
||||||
_ =>
|
_ =>
|
||||||
pure (left, spine)
|
pure (left, spine)
|
||||||
runPrefix stop left spine = pure (left, spine)
|
runPrefix stop left spine = pure (left, spine)
|
||||||
|
|||||||
@@ -1,14 +0,0 @@
|
|||||||
module ErrMsg
|
|
||||||
|
|
||||||
import Prelude
|
|
||||||
|
|
||||||
infixl 5 _$$_
|
|
||||||
|
|
||||||
_$$_ : Nat → (Nat → Nat) → Nat
|
|
||||||
a $$ b = a + b a
|
|
||||||
|
|
||||||
-- Say something other than expected record
|
|
||||||
-- Why do we get there? shouldn't the progress made by parseDef short circuit the <|>?
|
|
||||||
blah : Nat → Nat
|
|
||||||
blah x = x $$ $ \ y => y
|
|
||||||
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
*** Process tests/ErrMsg.newt
|
|
||||||
module Prelude
|
|
||||||
module ErrMsg
|
|
||||||
ERROR at tests/ErrMsg.newt:13:15--13:16: trailing operator
|
|
||||||
|
|
||||||
Compile failed
|
|
||||||
20
tests/Section.newt
Normal file
20
tests/Section.newt
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
module Section
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
-- got infix in prefix position
|
||||||
|
add : Int → Int → Int
|
||||||
|
add = (+)
|
||||||
|
|
||||||
|
add2 : Int → Int
|
||||||
|
add2 = (+ 2)
|
||||||
|
|
||||||
|
-- trailing operator
|
||||||
|
add2' : Int → Int
|
||||||
|
add2' = (2 +)
|
||||||
|
|
||||||
|
main : IO Unit
|
||||||
|
main = do
|
||||||
|
printLn $ (+) 2 3
|
||||||
|
printLn $ (+ 3) 2
|
||||||
|
printLn $ (2 +) 3
|
||||||
3
tests/Section.newt.golden
Normal file
3
tests/Section.newt.golden
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
5
|
||||||
|
5
|
||||||
|
5
|
||||||
13
tests/TrailDollar.newt
Normal file
13
tests/TrailDollar.newt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
module TrailDollar
|
||||||
|
|
||||||
|
import Prelude
|
||||||
|
|
||||||
|
infixl 5 _$$_
|
||||||
|
|
||||||
|
_$$_ : Nat → (Nat → Nat) → Nat
|
||||||
|
a $$ b = a + b a
|
||||||
|
|
||||||
|
-- Previously this didn't parse, but it does with operator section support.
|
||||||
|
blah : Nat → Nat
|
||||||
|
blah x = x $$ $ \ y => y
|
||||||
|
|
||||||
Reference in New Issue
Block a user