33 | 33 |
| "set" Variable "=" Term
|
34 | 34 |
| "return" Term
|
35 | 35 |
| "fail"
|
|
36 |
| "print" Term
|
36 | 37 |
| LitToken
|
37 | 38 |
| ProdName ["(" [Term {"," Term} ")"] ["@" Term].
|
38 | 39 |
Term := Atom
|
|
116 | 117 |
+ foo
|
117 | 118 |
+ foo 0 0 0 0 0
|
118 | 119 |
= blerp
|
|
120 |
|
|
121 |
And like any good language, you can print things.
|
|
122 |
|
|
123 |
| main = print hello & return world.
|
|
124 |
+ ahoshoshohspohdphs
|
|
125 |
= hello
|
|
126 |
= world
|
119 | 127 |
|
120 | 128 |
But back to parsing. The `&` operator processes its left-hand side on the
|
121 | 129 |
input, then the right-hand side. It returns the result of its RHS. But if
|
|
444 | 452 |
@+ (nil)
|
445 | 453 |
@= cons(a, cons(b, nil))
|
446 | 454 |
|
|
455 |
|
|
456 |
| main = set L = nil & (aorb & set L = el(L) | cord & set L = le(L)) &
|
|
457 |
| return L.
|
|
458 |
| aorb = "a" | "b".
|
|
459 |
| cord = "c" | eorf.
|
|
460 |
| eorf = "e" | "f".
|
|
461 |
+ e
|
|
462 |
= le(nil)
|
|
463 |
|
447 | 464 |
So let's write it in the less intuitive, recursive way:
|
448 | 465 |
|
449 | 466 |
| main = sexp.
|
|
513 | 530 |
| eval(X) = return X.
|
514 | 531 |
+ ((((a b cons) b cons) tail) tail)
|
515 | 532 |
= a
|
|
533 |
|
|
534 |
| main = sexp → S & eval(S).
|
|
535 |
| sexp = symbol | list.
|
|
536 |
| list = "(" & listtail(nil).
|
|
537 |
| listtail(L) = sexp → S & listtail(pair(S, L))
|
|
538 |
| | ")" & return L.
|
|
539 |
| symbol = "cons" | "head" | "tail" | "nil" | "a" | "b" | "c".
|
|
540 |
|
|
|
541 |
| head(pair(A, B)) = return A.
|
|
542 |
| tail(pair(A, B)) = return B.
|
|
543 |
| cons(A, B) = return pair(A, B).
|
|
544 |
|
|
|
545 |
| eval(pair(head, pair(X, nil))) = eval(X) → R & head(R) → P & return P.
|
|
546 |
| eval(pair(tail, pair(X, nil))) = eval(X) → R & tail(R) → P & return P.
|
|
547 |
| eval(pair(cons, pair(A, pair(B, nil)))) =
|
|
548 |
| eval(A) → AE & eval(B) → BE & return pair(AE, BE).
|
|
549 |
| eval(X) = return X.
|
|
550 |
+ ((a b cons) head)
|
|
551 |
= b
|
|
552 |
|
|
553 |
| main = sexp → S & eval(S).
|
|
554 |
| sexp = symbol | list.
|
|
555 |
| list = "(" & listtail(nil).
|
|
556 |
| listtail(L) = sexp → S & listtail(pair(S, L))
|
|
557 |
| | ")" & return L.
|
|
558 |
| symbol = "cons" | "head" | "tail" | "nil" | "a" | "b" | "c".
|
|
559 |
|
|
|
560 |
| head(pair(A, B)) = return A.
|
|
561 |
| tail(pair(A, B)) = return B.
|
|
562 |
| cons(A, B) = return pair(A, B).
|
|
563 |
|
|
|
564 |
| eval(pair(head, pair(X, nil))) = eval(X) → R & head(R) → P & return P.
|
|
565 |
| eval(pair(tail, pair(X, nil))) = eval(X) → R & tail(R) → P & return P.
|
|
566 |
| eval(pair(cons, pair(A, pair(B, nil)))) =
|
|
567 |
| eval(A) → AE & eval(B) → BE & return pair(AE, BE).
|
|
568 |
| eval(X) = return X.
|
|
569 |
+ ((a b cons) tail)
|
|
570 |
= a
|
|
571 |
|
|
572 |
| main = sexp → S & print S & reverse(S) → R & print R & eval(R).
|
|
573 |
| sexp = symbol | list.
|
|
574 |
| list = "(" & listtail(nil).
|
|
575 |
| listtail(L) = sexp → S & listtail(pair(L, S))
|
|
576 |
| | ")" & return L.
|
|
577 |
| symbol = "cons" | "head" | "tail" | "nil" | "a" | "b" | "c".
|
|
578 |
|
|
|
579 |
| reverse(pair(A, B)) = reverse(A) → RA & reverse(B) → RB & return pair(RB, RA).
|
|
580 |
| reverse(X) = return X.
|
|
581 |
|
|
|
582 |
| head(pair(A, B)) = return A.
|
|
583 |
| tail(pair(A, B)) = return B.
|
|
584 |
| cons(A, B) = return pair(A, B).
|
|
585 |
|
|
|
586 |
| eval(pair(head, pair(X, nil))) = eval(X) → R & head(R) → P & return P.
|
|
587 |
| eval(pair(tail, pair(X, nil))) = eval(X) → R & tail(R) → P & return P.
|
|
588 |
| eval(pair(cons, pair(A, pair(B, nil)))) =
|
|
589 |
| eval(A) → AE & eval(B) → BE &
|
|
590 |
| print AE & print BE & cons(AE, BE) → C & return C.
|
|
591 |
| eval(X) = return X.
|
|
592 |
+ (((a b cons) head) ((a b cons) tail) cons)
|
|
593 |
= pair(a, b)
|
|
594 |
|
|
595 |
pair(
|
|
596 |
cons,
|
|
597 |
pair(
|
|
598 |
pair(
|
|
599 |
tail,
|
|
600 |
pair(
|
|
601 |
pair(
|
|
602 |
cons,
|
|
603 |
pair(
|
|
604 |
b,
|
|
605 |
pair(
|
|
606 |
a,
|
|
607 |
nil
|
|
608 |
)
|
|
609 |
)
|
|
610 |
),
|
|
611 |
nil
|
|
612 |
)
|
|
613 |
),
|
|
614 |
nil
|
|
615 |
)
|
|
616 |
)
|
|
617 |
|
|
618 |
(cons (tail (cons (b a))))
|
516 | 619 |
|
517 | 620 |
@| sexp = symbol | list.
|
518 | 621 |
@| list = "(" &
|