From 733aef627660b769d1d74ec5ff38173b064c2860 Mon Sep 17 00:00:00 2001 From: Eduardo Cavazos Date: Thu, 17 Apr 2008 19:46:28 -0500 Subject: [PATCH] shell: Add environment variable lookup --- extra/shell/parser/parser.factor | 6 ++++- extra/shell/shell.factor | 46 +++++++++++++++++++++----------- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/extra/shell/parser/parser.factor b/extra/shell/parser/parser.factor index 846ff9cbf1..4e3ae8069c 100644 --- a/extra/shell/parser/parser.factor +++ b/extra/shell/parser/parser.factor @@ -14,6 +14,8 @@ TUPLE: double-quoted-expr expr ; TUPLE: back-quoted-expr expr ; TUPLE: glob-expr expr ; +TUPLE: variable-expr expr ; + ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : single-quoted-expr boa ; @@ -45,6 +47,8 @@ bquote = "`" back-quoted = bquote (!(bquote) .)* bquote => [[ second >string ]] +variable = "$" other => [[ second variable-expr boa ]] + glob-char = ("*" | "?") non-glob-char = !(glob-char | white) . @@ -57,7 +61,7 @@ glob = glob-beginning-string glob-char (glob-rest-string | glob-char)* => [[ fla other = (!(white | "&" | ">" | ">>" | "<") .)+ => [[ >string ]] -element = (single-quoted | double-quoted | back-quoted | glob | other) +element = (single-quoted | double-quoted | back-quoted | variable | glob | other) to-file = ">" whitespace other => [[ second ]] diff --git a/extra/shell/shell.factor b/extra/shell/shell.factor index 25ac09cbba..f36b6f6400 100644 --- a/extra/shell/shell.factor +++ b/extra/shell/shell.factor @@ -1,6 +1,6 @@ USING: kernel words continuations namespaces debugger sequences combinators - io io.files io.launcher + system io io.files io.launcher sequences.deep accessors multi-methods newfx shell.parser ; IN: shell @@ -32,11 +32,20 @@ METHOD: expand { single-quoted-expr } expr>> ; METHOD: expand { double-quoted-expr } expr>> ; +METHOD: expand { variable-expr } expr>> os-env ; + +METHOD: expand { glob-expr } + expr>> + dup "*" = + [ drop current-directory get directory [ first ] map ] + [ ] + if ; + METHOD: expand { object } ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -: expansion ( command -- command ) [ expand ] map ; +: expansion ( command -- command ) [ expand ] map flatten ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -53,10 +62,10 @@ METHOD: expand { object } ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : chant ( incantation -- ) - dup command>> first swords member-of? - [ command>> unclip "shell" lookup execute ] - [ run-incantation ] - if ; + dup command>> first swords member-of? + [ command>> unclip "shell" lookup execute ] + [ run-incantation ] + if ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! @@ -67,18 +76,25 @@ METHOD: expand { object } ; ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +DEFER: shell + +: handle ( input -- ) + { + { [ dup f = ] [ drop ] } + { [ dup "exit" = ] [ drop ] } + { [ dup "" = ] [ drop shell ] } + { [ dup expr ] [ expr ast>> chant shell ] } + { [ t ] [ drop "ix: ignoring input" print shell ] } + } + cond ; + +! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + : shell ( -- ) prompt readln - { - { [ dup f = ] [ drop ] } - { [ dup "exit" = ] [ drop ] } - { [ dup "" = ] [ drop shell ] } - { [ dup expr ] [ expr ast>> chant shell ] } - { [ t ] [ drop shell ] } - } - cond ; - + handle ; + ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! : ix ( -- ) shell ;