diff --git a/language.rkt b/language.rkt index a0d6904..2f8e017 100644 --- a/language.rkt +++ b/language.rkt @@ -4,6 +4,7 @@ (provide start pipe + ~> (except-out (all-from-out racket/base) #%app #%top) diff --git a/rash-lang.rkt b/rash-lang.rkt index 3fc4887..158e824 100644 --- a/rash-lang.rkt +++ b/rash-lang.rkt @@ -19,8 +19,14 @@ (let loop ([words '()] [delta 0]) (define-values (line col pos) (port-next-location in)) + (define peeked-char (peek-char in)) (cond - [(regexp-try-match #px"^[[:alnum:]]+" in) => + [(eof-object? peeked-char) + (read-char in) + (if (null? words) + eof + (list->rash-syntax (reverse words) delta))] + [(regexp-try-match #px"^[[:alnum:]~>]+" in) => (λ (r) (define m (bytes->string/utf-8 (car r))) (define len (string-length m)) @@ -36,16 +42,15 @@ (λ (r) (define m (bytes->string/utf-8 (car r))) (loop words (+ delta (string-length m))))] - [(regexp-match-peek #px"^\"" in) + [(char=? #\( peeked-char) + (define lst (read in)) + (define stx (datum->syntax #f lst)) + (loop (cons stx words) delta)] + [(char=? #\" peeked-char) (let* ([str (read in)] [len (+ 2 (string-length str))] [stx (datum->syntax #f str (vector src line col pos len))]) - (loop (cons str words) (+ delta len)))] - [(eof-object? (peek-char in)) - (read-char in) - (if (null? words) - eof - (list->rash-syntax (reverse words) delta))] + (loop (cons stx words) (+ delta len)))] [else (raise-read-error (string-append "Unknown character " (read-char in)) src line col pos 1)]))) @@ -68,4 +73,8 @@ "Read string" (check equal? '("echo" "hello world") - (rash-read (2port "echo \"hello world\""))))) + (rash-read (2port "echo \"hello world\"")))) + + (test-case + "Read an s-exp" + (check equal? '((~> (echo) (wc))) (rash-read (2port "(~> (echo) (wc))"))))) diff --git a/rash.rkt b/rash.rkt index 7c7288e..e65eccc 100644 --- a/rash.rkt +++ b/rash.rkt @@ -14,6 +14,7 @@ (foldl (λ (i j) (and i j)) #t (map string? (cdr command))))) (provide (contract-out + ;; TODO: Accept any/c for args. Convert to string in function. [start (->* (executable?) () #:rest (listof string?)