Skip to content

List as stream

Given a file named “pen.json” with:

{
"type": "application",
"dependencies": {
"Os": "pen:///os"
}
}

And a file named “Hello.pen” with:

import Os'Context { Context }
import Os'File
Hello = \(ctx Context) none {
_ = File'Write(ctx, File'StdOut(), "hello")
none
}

Given a file named “main.pen” with:

import 'Hello
main = \(ctx context) none {
[none Hello'Hello(ctx.Os)]
none
}

When I successfully run pen build

Then I successfully run ./app

And the stdout from “./app” should not contain “hello”.

Given a file named “main.pen” with:

import Os'Process
import 'Hello
main = \(ctx context) none {
if [x, ...xs] = [none Hello'Hello(ctx.Os)] {
x()
x()
none
} else {
Process'Exit(ctx.Os, 1)
}
}

When I successfully run pen build

Then I successfully run ./app

And the stdout from “./app” should contain exactly “hello”.

Given a file named “main.pen” with:

import Os'Context { Context }
import 'Hello
foo = \(ctx Context) [none] {
Hello'Hello(ctx)
[none]
}
main = \(ctx context) none {
[none ...foo(ctx.Os)]
none
}

When I successfully run pen build

Then I successfully run ./app

And the stdout from “./app” should not contain “hello”.

Evaluate multiple elements lazily but only once

Section titled “Evaluate multiple elements lazily but only once”

Given a file named “main.pen” with:

import Os'Context { Context }
import Os'Process
import 'Hello
foo = \(ctx Context) [none] {
Hello'Hello(ctx)
[none]
}
main = \(ctx context) none {
xs = [none ...foo(ctx.Os)]
if [x, ...xs] = xs {
Process'Exit(ctx.Os, 1)
} else {
if [x, ...xs] = xs {
Process'Exit(ctx.Os, 1)
} else {
none
}
}
}

When I successfully run pen build

Then I successfully run ./app

And the stdout from “./app” should contain exactly “hello”.