Skip to content

Commit

Permalink
add let-pattern
Browse files Browse the repository at this point in the history
  • Loading branch information
vito committed Jul 6, 2015
1 parent 1159324 commit 4f3a29c
Show file tree
Hide file tree
Showing 2 changed files with 51 additions and 0 deletions.
24 changes: 24 additions & 0 deletions kernel/let-pattern.ay
@@ -0,0 +1,24 @@
use(require("core"))
use(require("define"))
use(require("patterns"))

require("atomy/bootstrap")

let-pattern = class:
def(initialize(@body, @patterns)) {}

def(bytecode(gen, mod)):
new = Atomy Module new: use(mod)

@patterns each [`(~pat = ~exp)]:
definer = Atomy Bootstrap pattern-definer(
Atomy Grammar AST QuasiQuote new(pat)
exp
)

new evaluate(definer, new compile-context)

new compile(gen, @body)

macro(let-pattern(~*ms): ~*body):
let-pattern new(`(do: ~*body), ms)
27 changes: 27 additions & 0 deletions spec/kernel/let_pattern_spec.rb
@@ -0,0 +1,27 @@
require "spec_helper"

require "atomy/codeloader"

describe "let-pattern kernel" do
subject { Atomy::Module.new { use(require("let-pattern")) } }

it "defines the given pattern for the duration of the body" do
expect(subject.evaluate(seq(<<EOF))).to eq(5)
let-pattern(Foo = pattern('5)):
Foo = 5
EOF

expect { subject.evaluate(seq(<<EOF)) }.to raise_error(Atomy::PatternMismatch)
let-pattern(Foo = pattern('5)):
Foo = 6
EOF
end

it "has the pattern in-scope of each other" do
expect(subject.evaluate(seq(<<EOF))).to eq(5)
let-pattern(Foo = pattern('5), Bar = pattern(`(baz & Foo))):
Bar = 5
baz
EOF
end
end

0 comments on commit 4f3a29c

Please sign in to comment.