Compare commits
No commits in common. "5deab18356a228b2d0a46ccee25dff7bf0b9bf6e" and "95054ef234990c6254697f0c2122e4c06b5219a3" have entirely different histories.
5deab18356
...
95054ef234
|
@ -47,7 +47,7 @@
|
||||||
(def splat? (= :splat ((last members) :type)))
|
(def splat? (= :splat ((last members) :type)))
|
||||||
(when splat?
|
(when splat?
|
||||||
(when (< val-len patt-len)
|
(when (< val-len patt-len)
|
||||||
(print "mismatched splatted tuple lengths")
|
(print "mismatched splatted tuple lenghts")
|
||||||
(break {:success false :miss [pattern value]}))
|
(break {:success false :miss [pattern value]}))
|
||||||
(print "splat!")
|
(print "splat!")
|
||||||
(set splat (last members))
|
(set splat (last members))
|
||||||
|
@ -75,6 +75,7 @@
|
||||||
{:success true :ctx ctx}
|
{:success true :ctx ctx}
|
||||||
{:success false :miss [pattern value]}))
|
{:success false :miss [pattern value]}))
|
||||||
|
|
||||||
|
|
||||||
(defn- match-list [pattern value ctx]
|
(defn- match-list [pattern value ctx]
|
||||||
(when (not (array? value))
|
(when (not (array? value))
|
||||||
(break {:success false :miss [pattern value]}))
|
(break {:success false :miss [pattern value]}))
|
||||||
|
@ -85,13 +86,13 @@
|
||||||
(def splat? (= :splat ((last members) :type)))
|
(def splat? (= :splat ((last members) :type)))
|
||||||
(when splat?
|
(when splat?
|
||||||
(when (< val-len patt-len)
|
(when (< val-len patt-len)
|
||||||
(print "mismatched splatted list lengths")
|
(print "mismatched splatted tuple lenghts")
|
||||||
(break {:success false :miss [pattern value]}))
|
(break {:success false :miss [pattern value]}))
|
||||||
(print "splat!")
|
(print "splat!")
|
||||||
(set splat (last members))
|
(set splat (last members))
|
||||||
(set members (slice members 0 (dec patt-len))))
|
(set members (slice members 0 (dec patt-len))))
|
||||||
(when (and (not splat?) (not= val-len patt-len))
|
(when (and (not splat?) (not= val-len patt-len))
|
||||||
(print "mismatched list lengths")
|
(print "mismatched tuple lengths")
|
||||||
(break {:success false :miss [pattern value]}))
|
(break {:success false :miss [pattern value]}))
|
||||||
(var curr-mem :^nothing)
|
(var curr-mem :^nothing)
|
||||||
(var curr-val :^nothing)
|
(var curr-val :^nothing)
|
||||||
|
@ -99,7 +100,7 @@
|
||||||
(for i 0 (length members)
|
(for i 0 (length members)
|
||||||
(set curr-mem (get members i))
|
(set curr-mem (get members i))
|
||||||
(set curr-val (get value i))
|
(set curr-val (get value i))
|
||||||
(print "in list, matching " curr-val " with ")
|
(print "in tuple, matching " curr-val " with ")
|
||||||
(pp curr-mem)
|
(pp curr-mem)
|
||||||
(def match? (match-pattern curr-mem curr-val ctx))
|
(def match? (match-pattern curr-mem curr-val ctx))
|
||||||
(pp match?)
|
(pp match?)
|
||||||
|
@ -113,21 +114,6 @@
|
||||||
{:success true :ctx ctx}
|
{:success true :ctx ctx}
|
||||||
{:success false :miss [pattern value]}))
|
{:success false :miss [pattern value]}))
|
||||||
|
|
||||||
(defn- match-string [pattern value ctx]
|
|
||||||
(when (not (string? value))
|
|
||||||
(break {:success false :miss [pattern value]}))
|
|
||||||
(def {:compiled compiled :bindings bindings} pattern)
|
|
||||||
(print "matching " value " with")
|
|
||||||
(pp (pattern :grammar))
|
|
||||||
(def matches (peg/match compiled value))
|
|
||||||
(when (not matches)
|
|
||||||
(break {:success false :miss [pattern value]}))
|
|
||||||
(when (not= (length matches) (length bindings))
|
|
||||||
(error "oops: different number of matches and bindings"))
|
|
||||||
(for i 0 (length matches)
|
|
||||||
(set (ctx (bindings i)) (matches i)))
|
|
||||||
{:success true :ctx ctx})
|
|
||||||
|
|
||||||
(defn- match-pattern* [pattern value &opt ctx]
|
(defn- match-pattern* [pattern value &opt ctx]
|
||||||
(print "in match-pattern, matching " value " with:")
|
(print "in match-pattern, matching " value " with:")
|
||||||
(pp pattern)
|
(pp pattern)
|
||||||
|
@ -150,7 +136,6 @@
|
||||||
:tuple (match-tuple pattern value ctx)
|
:tuple (match-tuple pattern value ctx)
|
||||||
:list (match-list pattern value ctx)
|
:list (match-list pattern value ctx)
|
||||||
# TODO: string-patterns
|
# TODO: string-patterns
|
||||||
:interpolated (match-string pattern value ctx)
|
|
||||||
|
|
||||||
:typed (typed pattern value ctx)
|
:typed (typed pattern value ctx)
|
||||||
))
|
))
|
||||||
|
@ -401,20 +386,10 @@
|
||||||
|
|
||||||
(do
|
(do
|
||||||
(set source `
|
(set source `
|
||||||
match "foooooo" with {
|
match "foo" with {
|
||||||
"f{foo}{bar}{baz}" -> (foo, bar, baz)
|
"f{ooo}o" -> ooo
|
||||||
_ -> :nope
|
_ -> :nope
|
||||||
}
|
}
|
||||||
`)
|
`)
|
||||||
(run)
|
(run)
|
||||||
)
|
)
|
||||||
|
|
||||||
(def g @{:0 "f" :1 '(<- (to :2)) :2 "o" :3 -1
|
|
||||||
:main '(* :0 :1 :2 :3)})
|
|
||||||
|
|
||||||
(def f '{:0 "b" :1 (<- (to :2)) :2 (* "" -1)
|
|
||||||
:main (* :0 :1 :2)})
|
|
||||||
|
|
||||||
(def h ~(* (<- (to "a")) "a" -1))
|
|
||||||
|
|
||||||
(peg/match f "barrr")
|
|
||||||
|
|
|
@ -7,8 +7,8 @@ Tracking here, before I start writing this code, the kinds of validation we're h
|
||||||
* [ ] validate `with` forms
|
* [ ] validate `with` forms
|
||||||
* [ ] first-level property access with pkg, e.g. `Foo :bar`--bar must be on Foo
|
* [ ] first-level property access with pkg, e.g. `Foo :bar`--bar must be on Foo
|
||||||
- [ ] accept pkg-kws
|
- [ ] accept pkg-kws
|
||||||
* [ ] validate dict patterns
|
|
||||||
* [x] compile string-patterns
|
* [x] compile string-patterns
|
||||||
|
* [ ] validate dict patterns
|
||||||
* [x] `loop` form arity checking
|
* [x] `loop` form arity checking
|
||||||
* [x] arity checking of explicit named function calls
|
* [x] arity checking of explicit named function calls
|
||||||
* [x] flag tail calls
|
* [x] flag tail calls
|
||||||
|
@ -187,7 +187,7 @@ Imports are for a later iteration of Ludus:
|
||||||
(defn- str-pattern [validator]
|
(defn- str-pattern [validator]
|
||||||
(def ast (validator :ast))
|
(def ast (validator :ast))
|
||||||
(def data (ast :data))
|
(def data (ast :data))
|
||||||
(def last-term (-> data array/pop string))
|
(array/pop data)
|
||||||
(def grammar @{})
|
(def grammar @{})
|
||||||
(def bindings @[])
|
(def bindings @[])
|
||||||
(var current 0)
|
(var current 0)
|
||||||
|
@ -202,9 +202,9 @@ Imports are for a later iteration of Ludus:
|
||||||
~(<- (to ,(keyword (inc current)))))
|
~(<- (to ,(keyword (inc current)))))
|
||||||
(array/push bindings (node :data))))
|
(array/push bindings (node :data))))
|
||||||
(set current (inc current)))
|
(set current (inc current)))
|
||||||
(set (grammar (keyword current)) ~(* ,last-term -1))
|
|
||||||
(def rules (map keyword (range (length grammar))))
|
(def rules (map keyword (range (length grammar))))
|
||||||
(set (grammar :main) ~(* ,;rules))
|
(set (grammar (keyword current)) -1)
|
||||||
|
(set (grammar :main) ~(sequence ,;rules))
|
||||||
(set (ast :grammar) grammar)
|
(set (ast :grammar) grammar)
|
||||||
(set (ast :compiled) (peg/compile grammar))
|
(set (ast :compiled) (peg/compile grammar))
|
||||||
(set (ast :bindings) bindings))
|
(set (ast :bindings) bindings))
|
||||||
|
@ -622,12 +622,33 @@ Imports are for a later iteration of Ludus:
|
||||||
(def validator (new-validator ast))
|
(def validator (new-validator ast))
|
||||||
(validate validator))
|
(validate validator))
|
||||||
|
|
||||||
# (do
|
(do
|
||||||
(comment
|
# (comment
|
||||||
(def source `
|
(def source `
|
||||||
let "{foo}" = "bar"
|
let "{foo}" = "bar"
|
||||||
`)
|
`)
|
||||||
(def scanned (s/scan source))
|
(def scanned (s/scan source))
|
||||||
(def parsed (p/parse scanned))
|
(def parsed (p/parse scanned))
|
||||||
(valid parsed)
|
(valid parsed)
|
||||||
)
|
(print "VALIDATED!!")
|
||||||
|
(def grammar (get-in parsed [:ast :data 0 :data 0 :grammar]))
|
||||||
|
(pp grammar)
|
||||||
|
(peg/match grammar "foo"))
|
||||||
|
|
||||||
|
(def bar @{
|
||||||
|
:0 ""
|
||||||
|
:1 '(<- (to :2))
|
||||||
|
:2 ""
|
||||||
|
:main '(sequence :0 :1 :2 -1)
|
||||||
|
})
|
||||||
|
|
||||||
|
(peg/match bar "foo")
|
||||||
|
|
||||||
|
(def foo @{
|
||||||
|
:0 ""
|
||||||
|
:1 '(<- (to :2))
|
||||||
|
:2 -1
|
||||||
|
:main '(sequence :0 :1 :2)
|
||||||
|
})
|
||||||
|
|
||||||
|
(peg/match foo "foooooooobar")
|
||||||
|
|
Loading…
Reference in New Issue
Block a user