75 lines
2.1 KiB
Cheetah
75 lines
2.1 KiB
Cheetah
|
module basic
|
||
|
language fostr
|
||
|
|
||
|
/** md
|
||
|
Title: A whirlwind tour of fostr
|
||
|
|
||
|
## Whirlwind tour
|
||
|
|
||
|
fostr is just in its infancy, so it's not yet even ready for
|
||
|
Hello, World. The best we can offer now is this little snippet
|
||
|
that writes the sum of the ASCII codes for 'H', 'W', and '!' to standard output:
|
||
|
```fostr
|
||
|
**/
|
||
|
|
||
|
/** md */ test emit_sum [[
|
||
|
stdio << 72 + 87 + 33
|
||
|
]]/* **/ parse to Receives(Stdio(), Sum([Int("72"), Int("87"), Int("33")]))
|
||
|
/** writes
|
||
|
192**/
|
||
|
|
||
|
/** md
|
||
|
```
|
||
|
|
||
|
At the moment, there are only two ways to run a file containing fostr code
|
||
|
(you can find the above in `tests/emit_sum.fos`). They both start by
|
||
|
cloning this fostr project. Then, either:
|
||
|
|
||
|
1. Open the project in Eclipse and build it, visit your program file,
|
||
|
generate code from it in your preferred target language (among
|
||
|
the options available in the "Spoofax > Generate" menu), and execute the
|
||
|
resulting code.
|
||
|
|
||
|
1. Use the `bin/fosgen` bash script to generate code in a target language,
|
||
|
and execute the resulting code.
|
||
|
|
||
|
For example, this snippet generates the following Python:
|
||
|
```python
|
||
|
{! ../examples/emit_sum.py extract:
|
||
|
start: 'Stdio\s='
|
||
|
!}
|
||
|
```
|
||
|
(which writes "192" to standard output), or this non-idiomatic, inefficient, but
|
||
|
working Javascript:
|
||
|
```javascript
|
||
|
{! ../examples/emit_sum.js extract:
|
||
|
start: '^}'
|
||
|
!}
|
||
|
```
|
||
|
In either case, there's also a preamble defining Stdio that's generated.
|
||
|
(Haskell code generation is also currently supported.)
|
||
|
|
||
|
### Everything has a value
|
||
|
|
||
|
As mentioned in the [Introduction](../README.md), everything in a fostr
|
||
|
program (including the entire program itself) is an expression and has
|
||
|
a value. So what's the value of that expression above? Well, `stdio` is our
|
||
|
first example of a stream, and for convenience, the value of a stream
|
||
|
receiving an item is just the stream back again. The `<<` operator is also
|
||
|
left-associative, so that way we can chain insertions into a stream:
|
||
|
```fostr
|
||
|
**/
|
||
|
|
||
|
/** md */ test emit_twice [[
|
||
|
stdio << 72 + 87 + 33 << 291
|
||
|
]]/* **/ parse to Receives(
|
||
|
Receives(Stdio(), Sum([Int("72"), Int("87"), Int("33")])),
|
||
|
Int("291"))
|
||
|
/** writes
|
||
|
192291**/
|
||
|
|
||
|
/** md
|
||
|
```
|
||
|
Running this program produces a nice palindromic output: "192291".
|
||
|
**/
|