feat: add <<< and >>> abbreviating operations to default stream #21
@ -42,14 +42,18 @@ context-free syntax
|
||||
Ex.Stream = <stream>
|
||||
Ex.Sum = <<Ex> + <Ex>> {left}
|
||||
Ex.Gets = [[Ex] << [Ex]] {left}
|
||||
Ex.DefGets = [<<< [Ex]]
|
||||
Ex.To = [[Ex] >> [Ex]] {left}
|
||||
Ex.DefTo = [[Ex] >>>]
|
||||
|
||||
Ex = <(<Ex>)> {bracket}
|
||||
|
||||
context-free priorities
|
||||
|
||||
Ex.To
|
||||
> Ex.DefTo
|
||||
> Ex.Sum
|
||||
> Ex.DefGets
|
||||
> Ex.Gets,
|
||||
|
||||
// prevent cycle: no singletons
|
||||
|
@ -231,3 +231,15 @@ run desugar-fostr to TopLevel(Sequence([
|
||||
Terminate(Sum(Int("11"), To(Int("12"), Stream()))),
|
||||
To(To(Int("13"), Stream()), Stream())
|
||||
]))
|
||||
|
||||
test emit_several_default [[
|
||||
<<< 1 + 2; 3 >>>
|
||||
(4 + 5) >>> >> stream; stream << 6;
|
||||
<<< 7 << 75
|
||||
<<< 8
|
||||
+ (9+10);
|
||||
11 + 12 >>>; 13 >>>
|
||||
>>>
|
||||
]] parse succeeds
|
||||
/** writes
|
||||
3399677527121313*/
|
||||
|
@ -1,7 +1,7 @@
|
||||
stream << 1 + 2; 3 >> stream
|
||||
(4 + 5) >> stream; stream << 6;
|
||||
stream << 7
|
||||
stream << 8
|
||||
<<< 1 + 2; 3 >>>
|
||||
(4 + 5) >>> >> stream; stream << 6;
|
||||
<<< 7 << 75
|
||||
<<< 8
|
||||
+ (9+10);
|
||||
11 + 12 >> stream; 13 >> stream
|
||||
>> stream
|
||||
11 + 12 >>>; 13 >>>
|
||||
>>>
|
||||
|
@ -1 +1 @@
|
||||
stream << 'Hello, world!'
|
||||
<<< 'Hello, world!'
|
||||
|
@ -15,7 +15,9 @@ rules
|
||||
|
||||
seqFlatten: Sequence(l) -> Sequence(<mapconcat(?Sequence(<id>) <+ ![<id>])>l)
|
||||
|
||||
defStream: DefGets(x) -> Gets(Stream(), x)
|
||||
defStream: DefTo(x) -> To(x, Stream())
|
||||
|
||||
strategies
|
||||
|
||||
desugar-fostr = bottomup(try(deISe <+ seqFlatten))
|
||||
|
||||
desugar-fostr = bottomup(try(defStream <+ deISe <+ seqFlatten))
|
||||
|
@ -19,7 +19,8 @@ rules
|
||||
returning the final value.
|
||||
*/
|
||||
|
||||
hs: (_, TopLevel(val)) -> $[import System.IO
|
||||
hs: (_, TopLevel(val)) -> $[-- Preamble from fostr
|
||||
import System.IO
|
||||
data IOStream = StdIO
|
||||
|
||||
gets :: Show b => a -> b -> IO a
|
||||
|
@ -2,13 +2,16 @@ module javascript
|
||||
imports libstrategolib signatures/- util
|
||||
|
||||
rules
|
||||
js: TopLevel(x) -> $[const Stdio = {
|
||||
js: TopLevel(x) -> $[// Fostr preamble
|
||||
const Stdio = {
|
||||
gets: v => { process.stdout.write(String(v)); return Stdio; },
|
||||
}
|
||||
function to(data, strm) {
|
||||
strm.gets(data);
|
||||
return data;
|
||||
}
|
||||
// End of preamble
|
||||
|
||||
[x]]
|
||||
|
||||
js: Stream() -> $[Stdio]
|
||||
|
@ -2,7 +2,8 @@ module python
|
||||
imports libstrategolib signatures/- util
|
||||
rules
|
||||
|
||||
py: TopLevel(x) -> $[import sys
|
||||
py: TopLevel(x) -> $[## Fostr preamble
|
||||
import sys
|
||||
class StdioC:
|
||||
def gets(self, v):
|
||||
print(v, file=sys.stdout, end='')
|
||||
@ -11,6 +12,8 @@ rules
|
||||
strm.gets(data)
|
||||
return data
|
||||
Stdio = StdioC()
|
||||
## End of preamble
|
||||
|
||||
[x]]
|
||||
|
||||
py: Stream() -> $[Stdio]
|
||||
|
Loading…
Reference in New Issue
Block a user