shell: resurrecting from unmaintained to extra.
parent
ff99f69f02
commit
90994cc5d0
|
@ -1,11 +1,8 @@
|
||||||
|
USING: accessors kernel peg peg.ebnf sequences sequences.deep
|
||||||
USING: kernel arrays strings sequences sequences.deep accessors peg peg.ebnf
|
strings ;
|
||||||
newfx ;
|
|
||||||
|
|
||||||
IN: shell.parser
|
IN: shell.parser
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
TUPLE: basic-expr command stdin stdout background ;
|
TUPLE: basic-expr command stdin stdout background ;
|
||||||
TUPLE: pipeline-expr commands stdin stdout background ;
|
TUPLE: pipeline-expr commands stdin stdout background ;
|
||||||
TUPLE: single-quoted-expr expr ;
|
TUPLE: single-quoted-expr expr ;
|
||||||
|
@ -15,33 +12,34 @@ TUPLE: glob-expr expr ;
|
||||||
TUPLE: variable-expr expr ;
|
TUPLE: variable-expr expr ;
|
||||||
TUPLE: factor-expr expr ;
|
TUPLE: factor-expr expr ;
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
: ast>basic-expr ( ast -- obj )
|
||||||
|
first4 basic-expr boa ;
|
||||||
: ast>basic-expr ( ast -- obj ) first4 basic-expr boa ;
|
|
||||||
|
|
||||||
: ast>pipeline-expr ( ast -- obj )
|
: ast>pipeline-expr ( ast -- obj )
|
||||||
pipeline-expr new
|
pipeline-expr new
|
||||||
over [ 1st ] [ 4th [ 1st ] map ] [ 5th ] tri suffix prefix-on >>commands
|
over [ first ] [ fourth [ first ] map ] [ 4 swap nth ] tri
|
||||||
over 2nd >>stdin
|
suffix swap prefix >>commands
|
||||||
over 6th >>stdout
|
over second >>stdin
|
||||||
swap 7th >>background ;
|
over 5 swap nth >>stdout
|
||||||
|
swap 6 swap nth >>background ;
|
||||||
|
|
||||||
: ast>single-quoted-expr ( ast -- obj )
|
: ast>single-quoted-expr ( ast -- obj )
|
||||||
2nd >string single-quoted-expr boa ;
|
second >string single-quoted-expr boa ;
|
||||||
|
|
||||||
: ast>double-quoted-expr ( ast -- obj )
|
: ast>double-quoted-expr ( ast -- obj )
|
||||||
2nd >string double-quoted-expr boa ;
|
second >string double-quoted-expr boa ;
|
||||||
|
|
||||||
: ast>back-quoted-expr ( ast -- obj )
|
: ast>back-quoted-expr ( ast -- obj )
|
||||||
2nd >string back-quoted-expr boa ;
|
second >string back-quoted-expr boa ;
|
||||||
|
|
||||||
: ast>glob-expr ( ast -- obj ) flatten concat glob-expr boa ;
|
: ast>glob-expr ( ast -- obj )
|
||||||
|
flatten concat glob-expr boa ;
|
||||||
|
|
||||||
: ast>variable-expr ( ast -- obj ) 2nd variable-expr boa ;
|
: ast>variable-expr ( ast -- obj )
|
||||||
|
second variable-expr boa ;
|
||||||
|
|
||||||
: ast>factor-expr ( ast -- obj ) 2nd >string factor-expr boa ;
|
: ast>factor-expr ( ast -- obj )
|
||||||
|
second >string factor-expr boa ;
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
EBNF: expr
|
EBNF: expr
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
USING: accessors continuations debugger environment eval io
|
||||||
|
io.directories io.encodings.utf8 io.launcher io.pathnames
|
||||||
|
io.pipes kernel namespaces sequences sequences.deep shell.parser
|
||||||
|
splitting words ;
|
||||||
|
IN: shell
|
||||||
|
|
||||||
|
: cd ( args -- )
|
||||||
|
[ home ] [ first ] if-empty set-current-directory ;
|
||||||
|
|
||||||
|
: pwd ( args -- )
|
||||||
|
drop current-directory get print ;
|
||||||
|
|
||||||
|
CONSTANT: swords { "cd" "pwd" }
|
||||||
|
|
||||||
|
GENERIC: expand ( expr -- expr )
|
||||||
|
|
||||||
|
M: object expand ;
|
||||||
|
|
||||||
|
M: single-quoted-expr expand expr>> ;
|
||||||
|
|
||||||
|
M: double-quoted-expr expand expr>> ;
|
||||||
|
|
||||||
|
M: variable-expr expand expr>> os-env ;
|
||||||
|
|
||||||
|
M: glob-expr expand
|
||||||
|
expr>> dup "*" = [
|
||||||
|
drop current-directory get directory-files
|
||||||
|
] when ;
|
||||||
|
|
||||||
|
M: factor-expr expand expr>> eval>string ;
|
||||||
|
|
||||||
|
DEFER: expansion
|
||||||
|
|
||||||
|
M: back-quoted-expr expand
|
||||||
|
expr>> expr command>> expansion
|
||||||
|
utf8 [ contents ] with-process-reader
|
||||||
|
" \n" split harvest ;
|
||||||
|
|
||||||
|
: expansion ( command -- command ) [ expand ] map flatten ;
|
||||||
|
|
||||||
|
: run-sword ( basic-expr -- )
|
||||||
|
command>> expansion unclip
|
||||||
|
"shell" lookup-word execute( arguments -- ) ;
|
||||||
|
|
||||||
|
: run-foreground ( process -- )
|
||||||
|
[ try-process ] [ print-error drop ] recover ;
|
||||||
|
|
||||||
|
: run-background ( process -- )
|
||||||
|
run-detached drop ;
|
||||||
|
|
||||||
|
: run-basic-expr ( basic-expr -- )
|
||||||
|
<process>
|
||||||
|
over command>> expansion >>command
|
||||||
|
over stdin>> >>stdin
|
||||||
|
over stdout>> >>stdout
|
||||||
|
swap background>>
|
||||||
|
[ run-background ] [ run-foreground ] if ;
|
||||||
|
|
||||||
|
: basic-chant ( basic-expr -- )
|
||||||
|
dup command>> first swords member?
|
||||||
|
[ run-sword ] [ run-basic-expr ] if ;
|
||||||
|
|
||||||
|
: pipeline-chant ( pipeline-chant -- )
|
||||||
|
commands>> run-pipeline drop ;
|
||||||
|
|
||||||
|
: chant ( obj -- )
|
||||||
|
dup basic-expr? [ basic-chant ] [ pipeline-chant ] if ;
|
||||||
|
|
||||||
|
: prompt ( -- )
|
||||||
|
current-directory get write " $ " write flush ;
|
||||||
|
|
||||||
|
DEFER: shell
|
||||||
|
|
||||||
|
: handle ( input -- )
|
||||||
|
dup { f "exit" } member? [
|
||||||
|
drop
|
||||||
|
] [
|
||||||
|
[
|
||||||
|
expr [ chant ] [ "ix: ignoring input" print ] if*
|
||||||
|
] unless-empty shell
|
||||||
|
] if ;
|
||||||
|
|
||||||
|
: shell ( -- )
|
||||||
|
prompt readln handle ;
|
||||||
|
|
||||||
|
: ix ( -- ) shell ;
|
||||||
|
|
||||||
|
MAIN: ix
|
|
@ -1,140 +0,0 @@
|
||||||
USING: kernel parser words continuations namespaces debugger
|
|
||||||
sequences combinators splitting prettyprint system io io.files
|
|
||||||
io.pathnames io.launcher io.directories io.encodings.utf8 io.pipes
|
|
||||||
sequences.deep accessors multi-methods newfx shell.parser
|
|
||||||
combinators.short-circuit eval environment ;
|
|
||||||
IN: shell
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: cd ( args -- )
|
|
||||||
dup empty?
|
|
||||||
[ drop home set-current-directory ]
|
|
||||||
[ first set-current-directory ]
|
|
||||||
if ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: pwd ( args -- )
|
|
||||||
drop
|
|
||||||
current-directory get
|
|
||||||
print ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: swords ( -- seq ) { "cd" "pwd" } ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
GENERIC: expand ( expr -- expr )
|
|
||||||
|
|
||||||
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-files ]
|
|
||||||
[ ]
|
|
||||||
if ;
|
|
||||||
|
|
||||||
METHOD: expand { factor-expr } expr>> eval>string ;
|
|
||||||
|
|
||||||
DEFER: expansion
|
|
||||||
|
|
||||||
METHOD: expand { back-quoted-expr }
|
|
||||||
expr>>
|
|
||||||
expr
|
|
||||||
command>>
|
|
||||||
expansion
|
|
||||||
utf8 <process-stream>
|
|
||||||
contents
|
|
||||||
" \n" split
|
|
||||||
"" remove ;
|
|
||||||
|
|
||||||
METHOD: expand { object } ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: expansion ( command -- command ) [ expand ] map flatten ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: run-sword ( basic-expr -- )
|
|
||||||
command>> expansion unclip "shell" lookup execute( arguments -- ) ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: run-foreground ( process -- )
|
|
||||||
[ try-process ] [ print-error drop ] recover ;
|
|
||||||
|
|
||||||
: run-background ( process -- ) run-detached drop ;
|
|
||||||
|
|
||||||
: run-basic-expr ( basic-expr -- )
|
|
||||||
<process>
|
|
||||||
over command>> expansion >>command
|
|
||||||
over stdin>> >>stdin
|
|
||||||
over stdout>> >>stdout
|
|
||||||
swap background>>
|
|
||||||
[ run-background ]
|
|
||||||
[ run-foreground ]
|
|
||||||
if ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: basic-chant ( basic-expr -- )
|
|
||||||
dup command>> first swords member-of?
|
|
||||||
[ run-sword ]
|
|
||||||
[ run-basic-expr ]
|
|
||||||
if ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: pipeline-chant ( pipeline-chant -- ) commands>> run-pipeline drop ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: chant ( obj -- )
|
|
||||||
dup basic-expr?
|
|
||||||
[ basic-chant ]
|
|
||||||
[ pipeline-chant ]
|
|
||||||
if ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: prompt ( -- )
|
|
||||||
current-directory get write
|
|
||||||
" $ " write
|
|
||||||
flush ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
DEFER: shell
|
|
||||||
|
|
||||||
: handle ( input -- )
|
|
||||||
{
|
|
||||||
{ [ dup f = ] [ drop ] }
|
|
||||||
{ [ dup "exit" = ] [ drop ] }
|
|
||||||
{ [ dup "" = ] [ drop shell ] }
|
|
||||||
{ [ dup expr ] [ expr chant shell ] }
|
|
||||||
{ [ t ] [ drop "ix: ignoring input" print shell ] }
|
|
||||||
}
|
|
||||||
cond ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: shell ( -- )
|
|
||||||
prompt
|
|
||||||
readln
|
|
||||||
handle ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
: ix ( -- ) shell ;
|
|
||||||
|
|
||||||
! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|
|
||||||
|
|
||||||
MAIN: ix
|
|
Loading…
Reference in New Issue