ocaml: phase 2 function | pat -> body (+4 tests, 198 total)
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 54s
Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 54s
Sugar for fun + match. AST (:function CLAUSES) -> unary closure that runs ocaml-match-clauses on its arg. let rec recognises :function as a recursive rhs and ties the knot via cell, so let rec map f = function | [] -> [] | h::t -> f h :: map f t works. ocaml-match-eval refactored to share clause-walk with function.
This commit is contained in:
@@ -573,6 +573,28 @@
|
||||
(begin (advance-tok!) (one) (loop)))))
|
||||
(loop)
|
||||
(cons :match (cons scrut (list cases)))))))))
|
||||
(define parse-function
|
||||
(fn ()
|
||||
;; `function | pat -> body | …` ≡ fun x -> match x with | pat -> body
|
||||
(let ()
|
||||
(begin
|
||||
(when (at-op? "|") (advance-tok!))
|
||||
(let ((cases (list)))
|
||||
(begin
|
||||
(define one
|
||||
(fn ()
|
||||
(let ((p (parse-pattern)))
|
||||
(begin
|
||||
(consume! "op" "->")
|
||||
(let ((body (parse-expr)))
|
||||
(append! cases (list :case p body)))))))
|
||||
(one)
|
||||
(define loop
|
||||
(fn ()
|
||||
(when (at-op? "|")
|
||||
(begin (advance-tok!) (one) (loop)))))
|
||||
(loop)
|
||||
(list :function cases)))))))
|
||||
(define parse-for
|
||||
(fn ()
|
||||
(let ((name (ocaml-tok-value (consume! "ident" nil))))
|
||||
@@ -609,6 +631,7 @@
|
||||
((at-kw? "let") (begin (advance-tok!) (parse-let)))
|
||||
((at-kw? "if") (begin (advance-tok!) (parse-if)))
|
||||
((at-kw? "match") (begin (advance-tok!) (parse-match)))
|
||||
((at-kw? "function") (begin (advance-tok!) (parse-function)))
|
||||
((at-kw? "for") (begin (advance-tok!) (parse-for)))
|
||||
((at-kw? "while") (begin (advance-tok!) (parse-while)))
|
||||
(else (parse-tuple)))))
|
||||
|
||||
Reference in New Issue
Block a user