git @ Cat's Eye Technologies Tamsin / e601eb8
Add 'print', in quest of... finding out what this is doing. Cat's Eye Technologies 10 years ago
2 changed file(s) with 110 addition(s) and 0 deletion(s). Raw diff Collapse all Expand all
3333 | "set" Variable "=" Term
3434 | "return" Term
3535 | "fail"
36 | "print" Term
3637 | LitToken
3738 | ProdName ["(" [Term {"," Term} ")"] ["@" Term].
3839 Term := Atom
116117 + foo
117118 + foo 0 0 0 0 0
118119 = 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
119127
120128 But back to parsing. The `&` operator processes its left-hand side on the
121129 input, then the right-hand side. It returns the result of its RHS. But if
444452 @+ (nil)
445453 @= cons(a, cons(b, nil))
446454
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
447464 So let's write it in the less intuitive, recursive way:
448465
449466 | main = sexp.
513530 | eval(X) = return X.
514531 + ((((a b cons) b cons) tail) tail)
515532 = 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))))
516619
517620 @| sexp = symbol | list.
518621 @| list = "(" &
230230 return ('RETURN', t)
231231 elif self.consume('fail'):
232232 return ('FAIL',)
233 elif self.consume('print'):
234 t = self.term()
235 return ('PRINT', t)
233236 else:
234237 name = self.token
235238 self.scan()
443446 return ast[1].expand(self)
444447 elif ast[0] == 'FAIL':
445448 raise TamsinParseError("fail")
449 elif ast[0] == 'PRINT':
450 val = ast[1].expand(self)
451 print val
452 return val
446453 elif ast[0] == 'WHILE':
447454 result = Term('nil')
448455 while True: