{ meth Vec fmap: "Goldberg & Robson, 1989. p215" nc= / cls new . / do: [ x . nc ap: ( a runArg: x ) ] . nc } { meth Vec select: "Goldberg & Robson, 1989. p216" nc= / cls new . / do: [ x . ( a runArg: x ) ye: [ nc ap: x ] ] . nc } { meth Obj tup "Create a Singleton Tuple (a Vector)." [ / ] vec } { meth Obj tu: "Create a Tuple (a Vector) of Two Objects." [ / . a ] vec } { meth Obj tu:tu: "Create a Tuple (a Vector) of Three Objects." [ / . a . b ] vec } { meth Blk join: sb= Buf new . f= Tru . / vec do: [ x . f no: [ sb ap: a . f = Fal ] . sb ap: x ] . sb str . } { class App Usr } { class TopApp App } { meth TopApp handle:quer: "Default class for handling '/'." Map new at: 'type' pu: 'list' , at 'title' pu a , at 'value' pu [ [ '@@@link|/Browse|Browse' . 'Browse Classes.' ] vec . [ '@@@link|/FormDoit|doit' . 'Evaluate code' ] vec . ] vec . } { class Browse App } { meth Browse handle:quer: ww= a spli: '[.]' . "It's a regexp." wl= ww len . gm= Sys globalMap . "Start the list V with an UP link." v= [ '@@@link|/|TOP' tu: 'GOTO TOP.' ] vec . ( wl eq: 1 ) ye: [ "gk are Good Keys, those that are classes." gk= gm dir select: [ i . AND{ gm at: i , cls nam ends: 'Cls' . OR{ gm at: i , nam ends: 'Cls' , not . gm at: i , cls nam eq 'ClsCls' . } } ] . gk do: [ k . kc= gm at: k . kn= kc nam . v ap: ( '@@@link|/Browse.' ap: kn , ap: '|' , ap: kn , tu: kc meths str ) . ] . z= Map new at: 'type' pu: 'list' , at 'title' pu 'Browsing All Classes' , at 'extra' pu ( gm ) , at 'extraKeys' pu ( gm dir ) , at 'extraFmap' pu ( gm dir fmap: [ i . ( gm at: i ) cls cls nam ] ) , at 'extraSelect' pu gk , at 'value' pu v . ] . ( wl eq: 2 ) ye: [ cn= ww at: 1 . "class name" co= gm at: cn toLower . "class object" d= co cls methd . d dir do: [ x . "For each class method" v ap: ( ( '@@@link|/EditMethod.' ap: cn , ap: 'Cls.' , ap: x , ap: '|class ' , ap: x ) , tu: ( d at: x , str ) ) . ] . d= co methd . d dir do: [ x . "For each instance method" v ap: ( ( '@@@link|/EditMethod.' ap: cn , ap: '.' , ap: x , ap: '|' , ap: x ) tu: ( d at: x , str ) ) . ] . z= Map new at: 'type' pu: 'list' , at 'title' pu ( 'Browsing Class' ap: cn ) , at 'value' pu v . ] . z . } { class EditMethod App } { meth EditMethod handle:quer: ww= a spli: '[.]' . "It's a regexp." wl= ww len . gm= Sys globalMap . ( wl ne: 3 ) ye: [ Zork foo ] . cn= ww at: 1 . "class name" mn= ww at: 2 . "method name" co= gm at: cn toLower . "class object" mo= co methd at: mn . "method object" z= Map new at: 'type' pu: 'edit' , at 'title' pu ( 'Editing Class' ap: cn , ap: ' Method ' , ap: mn ) , at 'value' pu ( mo str ) , at 'action' pu ( '/SubmitMethod' ) , at 'field1' pu 'ClassName' , at 'value1' pu cn , at 'field2' pu 'MethodName' , at 'value2' pu mn . z . } { class SubmitMethod App } { meth SubmitMethod handle:quer: gm= Sys globalMap . cn= b at: 'ClassName' . mn= b at: 'MethodName' . co= gm at: cn tolower . z= co definemethod: mn abbrev: '' docstr: '' code: ( b at: 'text' ) . MAP[ 'type' . 'text' . 'title' . ( 'Submitting (NOT REALLY) Class' ap: cn , ap: ' Method ' , ap: mn ) . 'value' . 'XXX' . 'URL' . a . 'QUERY' . b . 'Z' . z . ] . } { class FormDoit App } { meth FormDoit handle:quer: MAP[ 'type' . 'edit' . 'title' . 'Doit Form' . 'value' . '' . 'action' . '/SubmitDoit' . ] . } { class SubmitDoit App } { meth SubmitDoit handle:quer: z= App new doit: ( b at 'text' ) . MAP[ 'type' . 'text' . 'title' . [ 'doit:' . ( b at 'text' ) str ] join: ' ' . 'value' . z str . ] . }