wsh2: Diskussion, Ideen, Fehler

Principles

  • simple syntax: primaries allow only unary ops! ==> call with arguments not as primary - in rexx block ok
  • nur Sachen in Syntax, die in Rexx clumsy sind, call ist ein Grenzfall $.[run($proc, a1, a2)$] ist ziemlich einfach, keine Syntax nur um wenige Buchstaben zu sparen!
  • pipes everywhere
  • variabeln Zugriff von TypeInfos entlasten, alles explizit in der Syntax (ausser with!) - implicit new's ersetzen durch embeded assignment in with a = .. $[
  • with über objectAsDictionary (hasKey und String <-> value aus class)
  • neue Namenskonvention (1 character marker für Funktionsnamen wie o2s und möglichst weit verbreitet) s→string, o→object, f→file r→run, m→stem, i→input, o→output???, b→block

newPipe

allgemeiner Input/output, new rexx

  • pipeIni
  • pipe opts*, out? , in* mit opts
    • '-'? '+'?: push pop frame
    • ('Y'| 'P'|'N'|'F')? Output Say, Parent NewBuf File mit arg(2). möglicheErweiterung: say zusätzlich
    • ('p'|'!'|'s'|'f')? Input: parent, oldOutput, data, file in arg(3). möglicheErweiterung mehrere dataLines oder files oder gemischt als Input - nur was nicht fast gleich einfach mit cat geht
    • für alle 3: missing: unverändert. Aenderungen ohne push/pop überschreiben einfach Vorgänger
    • close in out vor pop/replace in/out
  • pIn a1 ... als Abkürzung für pipe 's', , a1 ... (allenfalls weiter SpezialProzeduren, aber es gibt soviele Kombinationen...). shortInput wird somit call pIn 'select...'; call sql
  • in(var) read from stdIn
  • i2s(): read and concatenate all lines from stdIn
  • out line: write to stdOut
  • für Funktion mit InputParameter i2s mit Parameter, fall string/obj mitgegeben wurde sonst aus stdIn (implementiert heute als inp2str, aber dies muss in jede Funktion programmiert werden!)

wsh wie bis jetzt

  • block garantiert, dass nachher pipeFrame restored ist
  • $; trennt pipes
  • möglicheErweiterung ...$~... als Abkürzung für ... $<@= ... $; für natürliche Syntax call sql $~ select ... das ist doch shortInput!

3 Varianten um Skalierbarkeit sicherzustellen: nurStrings, Stems, Objects (zurzeit inp2str in out plus funktion str2inp, die Input setzt)

  • minimal Variante des Pipe Interfaces - einfachere Implementation geben einfach Fehler

abgelehnt

  • block mit zwei Types (resultatKind innerKind), 2 = im assignment durch resultKind ersetzen? ==> nur selten sinnvoll, zu komplex
  • assignmens und variablen von types und implict Aktionen entlasten!
    • ref =:[...] modifiziert bestehende Referenz, new falls null
    • ref =<:[...] als Code. file führt Code beim Oeffnen aus
  • jOpen/jClose ohne user Zähler: den brauchten wir nach pipeWriteAll von stdInput, damit er nicht zu früh geschlossen wird! das ersetzt die ganze Komplexität mit open/closable pipeFrames! Auch besser kein implizit open, macht ziemlich Mühe mit zählen!

ungelöst

SyntaxErweiterungen: z.B. wie in CX, UX: title mit cycle und langen Namen, Werte für mehrere Utilities - Referenzieren folgende Objekt Liste,

  • entweder call nach jeder Utility (aber ObjListe kommt nachher!), oder eine Sequnz von allen Assign'ten Werten
  • als CompilerErweiterung, der zusätzliche Scanners erlaubt
    • scanner: --> ast | null | syntax
    • Achtung, brauchen Möglichkeit, Source zu verändern - AST bzw. Code brauchen backlink auf Source mit insertAfter / replace Möglichkeiten (falls erlaubt)

obj ⇔ str: vereinheitlichen, entschärfen ....

  • strNat detect strings without leading strEsc
    • if not an object assume it's a string
    • use a common or registered prefix for objects
    • Wir arbeiten immer mit obj → value mit spezieller Syntax

Syntax

  • assignment (und überall wo sinnvoll, insbesondere benannter Inpujt) mit namedBlock ohne varName $=/ab/ ... $/ab/ oder $=<./ab/, vielleicht Namenssysntax vereinfachen?
  • vereinheitichung der verschiedene expr (für VariabelnNamen, strip, stopper = oder } etc..)
  • inlineData in wsh Syntax spiegeln mit benanntem Input
  • lokal Variablen, v.a. als Argumente für geschachtelte Blöcke, diese sind deklariert und durch ein statistche localMap auf eine localStack gemappt $@{:eins :zwei call....
  • in stmts überall wo sinnvoll exprBlock statt stmt einbauen
  • $@for → $for, überall wo sinnvoll

neue directives/starter ==> z.B. wsh s -> online und in $#

  • interpreter aufrufen, d.h. source als input nehmen, z.B. call sql $#<
  • variabeln setzen für jcl
  • kind setzen für input
  • output setzen in editMacro
  • verarbeitung für Input bestimmen in editMacro
  • wshCall = ( '$#' directive | wsh )*
  • directive = ( 'omit' | 'end' | 'out' | ( kind | ... )
  • include o.ä. um statisch oder dynamisch weiter inputs reinzuCompilieren: simple include facility and general compileTime processing and generating permanent named classes
  • Batch interface with statments (assignments) in inputstring

call mit Argumenten / returnValue - Simulation von rexx procedures

einfaches erstellen von Stems, ist in rexx häufig das einfachste und effizienteste, oder einfach mit rexx j2st(?, abc), oder $>.jStem(abc) (Variante von jBuf mit explizitem stem)

weiteres

  • singleton as special kind ! ==> gibt es schon in Objekt Syntax, oder allgemeinere MultiplicitySyntax?
  • remove compExpr 'd' ( => '')
  • Env or EnvMan without typing?
  • Prozedur aufruf [$@name $@name](primWord, primWord, ....) oder $-name(... (um objReferenz zurückzubekommen) name muss eine (evt. Lokel) Variable sein, kindOf Run
  • natürliche class Definitionen und class entschlacken (statt Registrierung methoden und classFields lazy initialisieren!, durch erste Vererbung auf classInitializer)
  • pseudoPrimary compile etc.. oder besser als rexx?
  • how? nested assignments
    • with syntax (block analog io redirection, sodass leave und iterate noch funktionieren), nicht getypt, einfach if symbo() == 'VAR then re ...
  • how tables?
  • noExpr Blöcke, fast keine $ mehr brauchen ? Z.B. für ParameterInput von Tools (marec, dbx, repa, ...)

altes pipe tutorial

stdIn the standard input for any function - thus it does not need a parameter for its input. The frequent input situations can be handled in wsh and rexx as follows:
  • input one or several string (or obj?), evaluated in advance
    • $; $$ ... $| .... $;
    • $; $=[ $] $| .... $;
    • call pipeBeLa '- eins', 'zwei' ...; ...; call pipeEnd
  • input a file from fileSystem
    • $; $<abc/efg .... $;
    • call pipeBeLa '< abc/de'; ....; call pipeEnd
  • input a file variable
    • $; $<.$abc .... $;
    • input a rexxObj obj (subclass of JRW)
      • $; $<.obj .... $;
    • input a code block evaluated at open/read time
      • $; $<.=[ .... $] .... $;
stdOut die wichtigsten Funktionen:
  • output to filesystem
  • output to a buf in variable pool (with creation if not present) is now in the file: constructor - that is not a good place!
  • output to a rexx variable or stdOut
  • output to a code block
pipe currently we have the following rexx pipe functions
  • pipeBegin: <, push
  • pipe: pop buf/buf push
  • pipeLast: pop buf/> push
  • pipeBeLa < > push
  • pipeEnd: pop
  • possible enhancements
    • opt <-: rest of this and all remaining args strings written to a new inputBuffer (pipeBeLa '<- eins', 'zwei'; ... (if first line == '<-' then empty buffer, '<- ' then buffer with empty string)
    • pipeEndBe und pipeEndBeLa
    • pipeAddIO mit 2. Argument (caller name) -> fehler falls falscher IO
stdSyn we need a syntax for stdIn and stdOut, e.g. when concatenating the input of stdIn instead of an other file

alte Semantics

Status quo

  • 2String: obj => String
    • var: envGet
    • Run: jCatLines(Run, ' ')
  • 2obj: obj => obj
    • var: envGetO
    • string: s2o
    • code: oRunner
  • @ (run)
    • obj: oRun
    • file: pipeWriteAll
  • 2file
    • string: fileNamed
    • obj: o2File
      • Run: jBufRun
      • String: fileNamed

extended kinds

  • b a block with elements (expressions), b1, b2, ...
  • ; c: rexx code, pseudoKind ;
  • . j: object of class JRW
  • . r: object of class ORun, includes . j
  • . o: object of any class includes . r and . j
  • - s: String
  • a: anything

co: conditions

  • aE: if each element of a block is . or -. The optimization with this condititon is semantically equivalent to the following definition without the exception, if none of the expression has side effects
opfromcotoresultrexx
-baE-cocatenates each line (- bi) casted to string, separated by 1 space 
-b --; b 
-; c -executes c and concatenates (- oi) for each output oi separated by one space 
-. r --@ro2string(f)
-- s -identys
-. o -depending of class of o select correct cast from aboveo2String(o)
.b . !; b 
.- s .cast string to strWs2o(s)
.; c . ryields an ORun with code c as oRun methodoRunner(c)
.. o .identityo
<b . j<@b 
<; c . jyields jBuf with output of execution of co2file(oRunner(c)))
<- s . jfile with fileSpec sfile(s)
<. j . jidentiyj
<. o . jif String or JRW as above, otherwise <@oo2file(o)
!baE.yields (. b1) if b has exactly on element otherwise fails 
!b . !; b 
!; c .executes c and yields ( o1) for the only output o1, fails if not exactly one output???
!a . !@ a 
?baE.yields null if b is empty, (. b1) if b has exactly 1 element, otherwise fails 
?a .analogous to ! 
;; b ;execute each (; bi) element of the block casted to ; 
;- s ;write s to stdOutcall out s
;. o ;write o to stdOutcall outO o
;; c ;execute c 
@b ;; b 
@. j ;reads j writes each line read (casted to obj) to stdOutcall jWriteAll j
@. o ;runs ooRun(o)
@; c ;executes c 

vorher

fromtooprexx 
StringString-identity 
FileString-o2Stringreads file and concatenates the lines (separated by one space). Fails if a line is not a String
ORunString-o2StringRuns the Run and concatenates ouput as for File
ObjectString-o2StringObjString yields value. Other classes as defined above, otherwise method o2String or fails
StringFile<fileString is filename (or specification) as implemented in the class File for Operating System used
FileFile<=identity
RunFile<o2FileFile runs Run at open time, subsequent reads will read the output (can append further line inbetween)
ObjectFile<o2Fileas defined for different classes above
StringORun@ fails
FileORun@ by inheritance: File writes its content to stdOutput
ORunORun@ identity
ObjectORun@oRunUses oRun method of object, fails if not existing
StringObject.s2onew ObjClass with value of the String
FileObject.=by inheritance
ORunObject.=by inheritance
ObjectObject.=identity
namesymbolLinuxwshrexx
escape to wsh$ Escape to wsh, variableMarker $var, output $$ 
comment* $**, $*+ or $*(....$*) 
piping
pipe!|stmt1 $| stmt2... call pipe ...
redirectOutput> output redirection $>...call pipeLast '> fileName'
redirectInput< input redirection $<...call pipeBegin '< fileName'
semicolon; Statement separator in $;call pipeBegin ... call pipeEnd
expressions
value- expression in $(, $-[, $-{, $-comp..., o2string
obj. expression in $(, $-[, $-{, $-comp..., s2o, file, etc.
isDefined? in ${?a}: is variable defined?envHasKey
StringDelimiter" $"..." 
StringDelimiter' $'...' 
statements
assignment= $=var= ...envPut, envPutO
run@ run block, call procedure, run object, $@for etc.call ...
blocks
braceBlock{...} for variables ${a} or short blocks $-{1+1} 
bracketBlock[...$]   
slashBlock/name/ .... $/name/   
fileSpecs
external spec&   
user~ ~.work.~dsn2jcl
var# #var 

the class hierarchy classes

String a rexx String, its contents is its value
obj a reference to an object, this is of course also a rexx String, but its contents is interpreted as objectAdress for an object with a class, not as contents
StrW an object, that is a string constant, the current implementation is a prefix by m.class.escW = ']'. In the rexx the class is called m.class.classW = 'w'.
StrV an object, that is a string variable that is directly assigned to m.a if the address is a. In the rexx the class is called m.class.classV = 'v'.
ORun an object that contains a method, that executes (interprets) some rexx code in its method oRun
JRW a class supporting Reads and Writes. the basis for all types of files and pipes. The oRun method reads until endOfFile and writes each object read unchanged to stdOut. If the JRW is not opened yet, it is opened for read and closed afterwards.
JBuf buffers input in a stem (memory) - from where it can later be read
File a File accessing the FileSystem, implementation depends on the operating system and environment, in our case it uses TSO.

systematic operations

  • cat(mid, file): file => string
    • cats all lines, with mid between each two lines, fails if it reads something not a string (or o2string?)
  • singelton: file => obj
    • returns first object of file, fails if file contains no or 2 or more objects
  • commandSubstitution: block => file (output or contents of block)
    • is this necessary
  • run: stmt => file
    • runs the stmt and ouput goes to stdOut (necessary?)
  • fileNamed: string => file
    • returns a file accessing the file with that name in the filesystem: fileSpec features ~. stdIn, stdOut, buf in variablePool? creates file if missing, ....,
  • fileOf: obj* => file
    • a file with contents of the given objects
  • o2file: obj => file
    • for run:
      • open input: run run and its stdOut is returned by read
      • open output: stores all output, at close time run is run with input the stored output
    • string fileNamed ???