operator sections
Some checks failed
Publish Playground / build (push) Has been cancelled
Publish Playground / deploy (push) Has been cancelled

This commit is contained in:
2026-01-31 13:21:23 -08:00
parent eed5c09508
commit c3e70c9ecc
8 changed files with 48 additions and 26 deletions

View File

@@ -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

View File

@@ -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))

View File

@@ -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)

View File

@@ -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

View File

@@ -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
View 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

View File

@@ -0,0 +1,3 @@
5
5
5

13
tests/TrailDollar.newt Normal file
View 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