diff options
Diffstat (limited to 'src/interp/ht-util.boot.pamphlet')
-rw-r--r-- | src/interp/ht-util.boot.pamphlet | 753 |
1 files changed, 753 insertions, 0 deletions
diff --git a/src/interp/ht-util.boot.pamphlet b/src/interp/ht-util.boot.pamphlet new file mode 100644 index 00000000..f875959f --- /dev/null +++ b/src/interp/ht-util.boot.pamphlet @@ -0,0 +1,753 @@ +\documentclass{article} +\usepackage{axiom} +\begin{document} +\title{\$SPAD/src/interp ht-util.boot} +\author{The Axiom Team} +\maketitle +\begin{abstract} +\end{abstract} +\eject +\tableofcontents +\eject +\section{License} +<<license>>= +-- Copyright (c) 1991-2002, The Numerical ALgorithms Group Ltd. +-- All rights reserved. +-- +-- Redistribution and use in source and binary forms, with or without +-- modification, are permitted provided that the following conditions are +-- met: +-- +-- - Redistributions of source code must retain the above copyright +-- notice, this list of conditions and the following disclaimer. +-- +-- - Redistributions in binary form must reproduce the above copyright +-- notice, this list of conditions and the following disclaimer in +-- the documentation and/or other materials provided with the +-- distribution. +-- +-- - Neither the name of The Numerical ALgorithms Group Ltd. nor the +-- names of its contributors may be used to endorse or promote products +-- derived from this software without specific prior written permission. +-- +-- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS +-- IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +-- TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +-- PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER +-- OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +-- EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +-- PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +-- PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +-- LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +-- NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +-- SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +@ +<<*>>= +<<license>> + +-- HyperTeX Utilities for generating basic Command pages +--)package "BOOT" + +$bcParseOnly := true + +-- List of issued hypertex lines +$htLineList := nil + +-- pointer to the page we are currently defining +$curPage := nil + +-- List of currently active window named +$activePageList := nil + +htpDestroyPage(pageName) == + pageName in $activePageList => + SET(pageName, nil) + $activePageList := NREMOVE($activePageList, pageName) + +htpName htPage == +-- GENSYM whose value is the page + ELT(htPage, 0) + +htpSetName(htPage, val) == + SETELT(htPage, 0, val) + +htpDomainConditions htPage == +-- List of Domain conditions + ELT(htPage, 1) + +htpSetDomainConditions(htPage, val) == + SETELT(htPage, 1, val) + +htpDomainVariableAlist htPage == +-- alist of pattern variables and conditions + ELT(htPage, 2) + +htpSetDomainVariableAlist(htPage, val) == + SETELT(htPage, 2, val) + +htpDomainPvarSubstList htPage == +-- alist of user pattern variables to system vars + ELT(htPage, 3) + +htpSetDomainPvarSubstList(htPage, val) == + SETELT(htPage, 3, val) + +htpRadioButtonAlist htPage == +-- alist of radio button group names and labels + ELT(htPage, 4) + +htpButtonValue(htPage, groupName) == + for buttonName in LASSOC(groupName, htpRadioButtonAlist htPage) repeat + (stripSpaces htpLabelInputString(htPage, buttonName)) = '"t" => + return buttonName + +htpSetRadioButtonAlist(htPage, val) == + SETELT(htPage, 4, val) + +htpInputAreaAlist htPage == +-- Alist of input-area labels, and default values + ELT(htPage, 5) + +htpSetInputAreaAlist(htPage, val) == + SETELT(htPage, 5, val) + +htpAddInputAreaProp(htPage, label, prop) == + SETELT(htPage, 5, [[label, nil, nil, nil, :prop], :ELT(htPage, 5)]) + +htpPropertyList htPage == +-- Association list of user-defined properties + ELT(htPage, 6) + +htpProperty(htPage, propName) == + LASSOC(propName, ELT(htPage, 6)) + +htpSetProperty(htPage, propName, val) == + pair := ASSOC(propName, ELT(htPage, 6)) + pair => RPLACD(pair, val) + SETELT(htPage, 6, [[propName, :val], :ELT(htPage, 6)]) + +htpLabelInputString(htPage, label) == +-- value user typed as input string on page + props := LASSOC(label, htpInputAreaAlist htPage) + props and STRINGP (s := ELT(props,0)) => + s = '"" => s + trimString s + nil + +htpLabelFilteredInputString(htPage, label) == +-- value user typed as input string on page + props := LASSOC(label, htpInputAreaAlist htPage) + props => + #props > 5 and ELT(props, 6) => + FUNCALL(SYMBOL_-FUNCTION ELT(props, 6), ELT(props, 0)) + replacePercentByDollar ELT(props, 0) + nil + +replacePercentByDollar s == fn(s,0,MAXINDEX s) where + fn(s,i,n) == + i > n => '"" + (m := charPosition(char "%",s,i)) > n => SUBSTRING(s,i,nil) + STRCONC(SUBSTRING(s,i,m - i),'"$",fn(s,m + 1,n)) + +htpSetLabelInputString(htPage, label, val) == +------------------> OBSELETE +-- value user typed as input string on page + props := LASSOC(label, htpInputAreaAlist htPage) + props => SETELT(props, 0, STRINGIMAGE val) + nil + +htpLabelSpadValue(htPage, label) == +-- Scratchpad value of parsed and evaled inputString, as (type . value) + props := LASSOC(label, htpInputAreaAlist htPage) + props => ELT(props, 1) + nil + +htpSetLabelSpadValue(htPage, label, val) == +-- value user typed as input string on page + props := LASSOC(label, htpInputAreaAlist htPage) + props => SETELT(props, 1, val) + nil + +htpLabelErrorMsg(htPage, label) == +-- error message associated with input area + props := LASSOC(label, htpInputAreaAlist htPage) + props => ELT(props, 2) + nil + +htpSetLabelErrorMsg(htPage, label, val) == +-- error message associated with input area + props := LASSOC(label, htpInputAreaAlist htPage) + props => SETELT(props, 2, val) + nil + +htpLabelType(htPage, label) == +-- either 'string or 'button + props := LASSOC(label, htpInputAreaAlist htPage) + props => ELT(props, 3) + nil + +htpLabelDefault(htPage, label) == +-- default value for the input area + msg := htpLabelInputString(htPage, label) => + msg = '"t" => 1 + msg = '"nil" => 0 + msg + props := LASSOC(label, htpInputAreaAlist htPage) + props => + ELT(props, 4) + nil + + +htpLabelSpadType(htPage, label) == +-- pattern variable for target domain for input area + props := LASSOC(label, htpInputAreaAlist htPage) + props => ELT(props, 5) + nil + +htpLabelFilter(htPage, label) == +-- string to string mapping applied to input area strings before parsing + props := LASSOC(label, htpInputAreaAlist htPage) + props => ELT(props, 6) + nil + +htpPageDescription htPage == +-- a list of all the commands issued to create the basic-command page + ELT(htPage, 7) + +htpSetPageDescription(htPage, pageDescription) == + SETELT(htPage, 7, pageDescription) + +htpAddToPageDescription(htPage, pageDescrip) == +-------------> OBSELETE <----------- + SETELT(htPage, 7, nconc(nreverse COPY_-LIST pageDescrip, ELT(htPage, 7))) + +iht line == +-- issue a single hyperteTeX line, or a group of lines + $newPage => nil + PAIRP line => + $htLineList := NCONC(nreverse mapStringize COPY_-LIST line, $htLineList) + $htLineList := [basicStringize line, :$htLineList] + +bcHt line == +--line = '"\##1" => harharhar() + iht line + PAIRP line => + if $newPage then htpAddToPageDescription($curPage, [['text, :line]]) + if $newPage then htpAddToPageDescription($curPage, [['text, line]]) + +bcIssueHt line == + PAIRP line => htMakePage1 line + iht line + +mapStringize l == + ATOM l => l + RPLACA(l, basicStringize CAR l) + RPLACD(l, mapStringize CDR l) + l + +basicStringize s == + STRINGP s => + s = '"\$" => '"\%" + s = '"{\em $}" => '"{\em \%}" + s + s = '_$ => '"\%" + PRINC_-TO_-STRING s + +stringize s == + STRINGP s => s + PRINC_-TO_-STRING s + +htInitPage(title, propList) == +----------------------------> OBSELETE---cannot return $curPage +-- start defining a hyperTeX page + htInitPageNoScroll(propList, title) + htSayStandard '"\beginscroll " + $curPage + + +--htInitPageNoHeading(propList) == +-----------------------> replaced by htInitPageNoScroll +-- start defining a hyperTeX page +-- $curPage := htpMakeEmptyPage(propList) +-- if $saturn then $saturnPage := htpMakeEmptyPage(propList) +-- $newPage := true +-- $htLineList := nil +-- $curPage + +htAddHeading(title) == +------------------------> OBSELETE + htNewPage title + $curPage + +htShowPage() == +-- show the page which has been computed + htSayStandard '"\endscroll" + htShowPageNoScroll() + +htShowPageNoScroll() == +------------------------> OBSELETE +-- show the page which has been computed + htSayStandard '"\autobuttons" + htpSetPageDescription($curPage, nreverse htpPageDescription $curPage) + $newPage := false + $htLineList := nil + htMakePage htpPageDescription $curPage + line := APPLY(function CONCAT, nreverse $htLineList) + issueHT line + endHTPage() + +htMakePage itemList == +------------------------> OBSELETE +-- make a page given the description in itemList + if $newPage then htpAddToPageDescription($curPage, itemList) + htMakePage1 itemList + +htMakePage1 itemList == +-- make a page given the description in itemList + for [itemType, :items] in itemList repeat + itemType = 'text => iht items + itemType = 'lispLinks => htLispLinks items + itemType = 'lispmemoLinks => htLispMemoLinks items + itemType = 'bcLinks => htBcLinks items ---> + itemType = 'bcLinksNS => htBcLinks(items,true) + itemType = 'bcLispLinks => htBcLispLinks items ---> + itemType = 'radioButtons => htRadioButtons items + itemType = 'bcRadioButtons => htBcRadioButtons items + itemType = 'inputStrings => htInputStrings items + itemType = 'domainConditions => htProcessDomainConditions items + itemType = 'bcStrings => htProcessBcStrings items + itemType = 'toggleButtons => htProcessToggleButtons items + itemType = 'bcButtons => htProcessBcButtons items + itemType = 'doneButton => htProcessDoneButton items + itemType = 'doitButton => htProcessDoitButton items + systemError ['"unknown itemType", itemType] + +htMakeErrorPage htPage == +------------------> OBSELETE + $newPage := false + $htLineList := nil + $curPage := htPage + htMakePage htpPageDescription htPage + line := APPLY(function CONCAT, nreverse $htLineList) + issueHT line + endHTPage() + +htQuote s == +-- wrap quotes around a piece of hyperTeX + iht '"_"" + iht s + iht '"_"" + +htProcessToggleButtons buttons == + iht '"\newline\indent{5}\beginitems " + for [message, info, defaultValue, buttonName] in buttons repeat + if NULL LASSOC(buttonName, htpInputAreaAlist $curPage) then + setUpDefault(buttonName, ['button, defaultValue]) + iht ['"\item{\em\inputbox[", htpLabelDefault($curPage, buttonName), '"]{", + buttonName, '"}{\htbmfile{pick}}{\htbmfile{unpick}}\space{}"] + bcIssueHt message + iht '"\space{}}" + bcIssueHt info + iht '"\enditems\indent{0} " + +htProcessBcButtons buttons == + for [defaultValue, buttonName] in buttons repeat + if NULL LASSOC(buttonName, htpInputAreaAlist $curPage) then + setUpDefault(buttonName, ['button, defaultValue]) + k := htpLabelDefault($curPage,buttonName) + k = 0 => iht ['"\off{",buttonName,'"}"] + k = 1 => iht ['"\on{", buttonName,'"}"] + iht ['"\inputbox[", htpLabelDefault($curPage, buttonName), '"]{", + buttonName, '"}{\htbmfile{pick}}{\htbmfile{unpick}}"] + +htProcessBcStrings strings == +---------------------> OBSELETE <------------------------ + for [numChars, default, stringName, spadType, :filter] in strings repeat + mess2 := '"" + if NULL LASSOC(stringName, htpInputAreaAlist $curPage) then + setUpDefault(stringName, ['string, default, spadType, filter]) + if htpLabelErrorMsg($curPage, stringName) then + iht ['"\centerline{{\em ", htpLabelErrorMsg($curPage, stringName), '"}}"] + mess2 := CONCAT(mess2, bcSadFaces()) + htpSetLabelErrorMsg($curPage, stringName, nil) + iht ['"\inputstring{", stringName, '"}{", + numChars, '"}{", htpLabelDefault($curPage,stringName), '"} ", mess2] + +bcSadFaces() == + '"\space{1}{\em\htbitmap{error}\htbitmap{error}\htbitmap{error}}" + +htLispLinks(links,:option) == + [links,options] := beforeAfter('options,links) + indent := LASSOC('indent,options) or 5 + iht '"\newline\indent{" + iht stringize indent + iht '"}\beginitems" + for [message, info, func, :value] in links repeat + iht '"\item[" + call := (IFCAR option => '"\lispmemolink"; '"\lispdownlink") + htMakeButton(call,message, mkCurryFun(func, value)) + iht ['"]\space{}"] + bcIssueHt info + iht '"\enditems\indent{0} " + +htLispMemoLinks(links) == htLispLinks(links,true) + +htBcLinks(links,:options) == +-------------------------> OBSELETE + skipStateInfo? := IFCAR options + [links,options] := beforeAfter('options,links) + for [message, info, func, :value] in links repeat + htMakeButton('"\lispdownlink",message, + mkCurryFun(func, value),skipStateInfo?) + bcIssueHt info + +htBcLispLinks links == +-------------------------> OBSELETE + [links,options] := beforeAfter('options,links) + for [message, info, func, :value] in links repeat + htMakeButton('"\lisplink",message, mkCurryFun(func, value)) + bcIssueHt info + +beforeAfter(x,u) == [[y for [y,:r] in tails u while x ^= y],r] + +mkCurryFun(fun, val) == + name := GENTEMP() + code := + ['DEFUN, name, '(arg), ['APPLY, MKQ fun, ['CONS, 'arg, MKQ val]]] + EVAL code + name + +htRadioButtons [groupName, :buttons] == + htpSetRadioButtonAlist($curPage, [[groupName, :buttonNames buttons], + : htpRadioButtonAlist $curPage]) + boxesName := GENTEMP() + iht ['"\newline\indent{5}\radioboxes{", boxesName, + '"}{\htbmfile{pick}}{\htbmfile{unpick}}\beginitems "] + defaultValue := '"1" + for [message, info, buttonName] in buttons repeat + if NULL LASSOC(buttonName, htpInputAreaAlist $curPage) then + setUpDefault(buttonName, ['button, defaultValue]) + defaultValue := '"0" + iht ['"\item{\em\radiobox[", htpLabelDefault($curPage, buttonName), '"]{", + buttonName, '"}{",boxesName, '"}\space{}"] + bcIssueHt message + iht '"\space{}}" + bcIssueHt info + iht '"\enditems\indent{0} " + +htBcRadioButtons [groupName, :buttons] == + htpSetRadioButtonAlist($curPage, [[groupName, :buttonNames buttons], + : htpRadioButtonAlist $curPage]) + boxesName := GENTEMP() + iht ['"\radioboxes{", boxesName, + '"}{\htbmfile{pick}}{\htbmfile{unpick}} "] + defaultValue := '"1" + for [message, info, buttonName] in buttons repeat + if NULL LASSOC(buttonName, htpInputAreaAlist $curPage) then + setUpDefault(buttonName, ['button, defaultValue]) + defaultValue := '"0" + iht ['"{\em\radiobox[", htpLabelDefault($curPage, buttonName), '"]{", + buttonName, '"}{",boxesName, '"}"] + bcIssueHt message + iht '"\space{}}" + bcIssueHt info + +setUpDefault(name, props) == +---------------> OBSELETE <---------------- + htpAddInputAreaProp($curPage, name, props) + +buttonNames buttons == + [buttonName for [.,., buttonName] in buttons] + +htInputStrings strings == + iht '"\newline\indent{5}\beginitems " + for [mess1, mess2, numChars, default, stringName, spadType, :filter] + in strings repeat + if NULL LASSOC(stringName, htpInputAreaAlist $curPage) then + setUpDefault(stringName, ['string, default, spadType, filter]) + if htpLabelErrorMsg($curPage, stringName) then + iht ['"\centerline{{\em ", htpLabelErrorMsg($curPage, stringName), '"}}"] + + mess2 := CONCAT(mess2, bcSadFaces()) + htpSetLabelErrorMsg($curPage, stringName, nil) + iht '"\item " + bcIssueHt mess1 + iht ['"\inputstring{", stringName, '"}{", + numChars, '"}{", htpLabelDefault($curPage,stringName), '"} "] + bcIssueHt mess2 + iht '"\enditems\indent{0}\newline " + +htProcessDomainConditions condList == + htpSetDomainConditions($curPage, renamePatternVariables condList) + htpSetDomainVariableAlist($curPage, computeDomainVariableAlist()) + +renamePatternVariables condList == + htpSetDomainPvarSubstList($curPage, + renamePatternVariables1(condList, nil, $PatternVariableList)) + substFromAlist(condList, htpDomainPvarSubstList $curPage) + +renamePatternVariables1(condList, substList, patVars) == + null condList => substList + [cond, :restConds] := condList + cond is ['isDomain, pv, pattern] or cond is ['ofCategory, pv, pattern] + or cond is ['Satisfies, pv, cond] => + if pv = $EmptyMode then nsubst := substList + else nsubst := [[pv, :car patVars], :substList] + renamePatternVariables1(restConds, nsubst, rest patVars) + substList + +substFromAlist(l, substAlist) == + for [pvar, :replace] in substAlist repeat + l := SUBST(replace, pvar, l) + l + +computeDomainVariableAlist() == + [[pvar, :pvarCondList pvar] for [., :pvar] in + htpDomainPvarSubstList $curPage] + +pvarCondList pvar == + nreverse pvarCondList1([pvar], nil, htpDomainConditions $curPage) + +pvarCondList1(pvarList, activeConds, condList) == + null condList => activeConds + [cond, : restConds] := condList + cond is [., pv, pattern] and pv in pvarList => + pvarCondList1(nconc(pvarList, pvarsOfPattern pattern), + [cond, :activeConds], restConds) + pvarCondList1(pvarList, activeConds, restConds) + +pvarsOfPattern pattern == + NULL LISTP pattern => nil + [pvar for pvar in rest pattern | pvar in $PatternVariableList] + +htMakeTemplates(templateList, numLabels) == + templateList := [templateParts template for template in templateList] + [[substLabel(i, template) for template in templateList] + for i in 1..numLabels] where substLabel(i, template) == + PAIRP template => + INTERN CONCAT(first template, PRINC_-TO_-STRING i, rest template) + template + +templateParts template == + NULL STRINGP template => template + i := SEARCH('"%l", template) + null i => template + [SUBSEQ(template, 0, i), : SUBSEQ(template, i+2)] + +htMakeDoneButton(message, func) == + bcHt '"\newline\vspace{1}\centerline{" + if message = '"Continue" then + bchtMakeButton('"\lispdownlink", "\ContinueBitmap", func) + else + bchtMakeButton('"\lispdownlink",CONCAT('"\box{", message, '"}"), func) + bcHt '"} " + +htProcessDoneButton [label , func] == + iht '"\newline\vspace{1}\centerline{" + + if label = '"Continue" then + htMakeButton('"\lispdownlink", "\ContinueBitmap", func) + else if label = '"Push to enter names" then + htMakeButton('"\lispdownlink",'"\ControlBitmap{ClickToSet}", func) + else + htMakeButton('"\lispdownlink", CONCAT('"\box{", label, '"}"), func) + + iht '"} " + +htMakeButton(htCommand, message, func,:options) == +----------> OBSELETE <---------------------------------- + skipStateInfo? := IFCAR options + iht [htCommand, '"{"] + bcIssueHt message + skipStateInfo? => + iht ['"}{(|htDoneButton| '|", func, '"| ",htpName $curPage, '")}"] + iht ['"}{(|htDoneButton| '|", func, '"| (PROGN "] + for [id, ., ., ., type, :.] in htpInputAreaAlist $curPage repeat + iht ['"(|htpSetLabelInputString| ", htpName $curPage, '"'|", id, '"| "] + if type = 'string then + iht ['"_"\stringvalue{", id, '"}_""] + else + iht ['"_"\boxvalue{", id, '"}_""] + iht '") " + iht [htpName $curPage, '"))}"] + +bchtMakeButton(htCommand, message, func) == + bcHt [htCommand, '"{", message, + '"}{(|htDoneButton| '|", func, '"| (PROGN "] + for [id, ., ., ., type, :.] in htpInputAreaAlist $curPage repeat + bcHt ['"(|htpSetLabelInputString| ", htpName $curPage, '"'|", id, '"| "] + if type = 'string then + bcHt ['"_"\stringvalue{", id, '"}_""] + else + bcHt ['"_"\boxvalue{", id, '"}_""] + bcHt '") " + bcHt [htpName $curPage, '"))} "] + +htProcessDoitButton [label, command, func] == + fun := mkCurryFun(func, [command]) + iht '"\newline\vspace{1}\centerline{" + htMakeButton('"\lispcommand", CONCAT('"\box{", label, '"}"), fun) + iht '"} " + iht '"\vspace{2}{Select \ \UpButton{} \ to go back one page.}" + iht '"\newline{Select \ \ExitButton{QuitPage} \ to remove this window.}" + +htMakeDoitButton(label, command) == + -- use bitmap button if just plain old "Do It" + if label = '"Do It" then + bcHt '"\newline\vspace{1}\centerline{\lispcommand{\DoItBitmap}{(|doDoitButton| " + else + bcHt ['"\newline\vspace{1}\centerline{\lispcommand{\box{", label, + '"}}{(|doDoitButton| "] + bcHt htpName $curPage + bcHt ['" _"", htEscapeString command, '"_""] + bcHt '")}}" + + bcHt '"\vspace{2}{Select \ \UpButton{} \ to go back one page.}" + bcHt '"\newline{Select \ \ExitButton{QuitPage} \ to remove this window.}" + +doDoitButton(htPage, command) == + executeInterpreterCommand command + +executeInterpreterCommand command == + PRINC command + TERPRI() + ncSetCurrentLine(command) + CATCH('SPAD__READER, parseAndInterpret command) + PRINC MKPROMPT() + FINISH_-OUTPUT() + +htDoneButton(func, htPage) == + typeCheckInputAreas htPage => + htMakeErrorPage htPage + NULL FBOUNDP func => + systemError ['"unknown function", func] + FUNCALL(SYMBOL_-FUNCTION func, htPage) + +typeCheckInputAreas htPage == + -- This needs to be severly beefed up + inputAlist := nil + errorCondition := false + for entry in htpInputAreaAlist htPage + | entry is [stringName, ., ., ., 'string, ., spadType, filter] repeat + condList := + LASSOC(LASSOC(spadType,htpDomainPvarSubstList htPage), + htpDomainVariableAlist htPage) + string := htpLabelFilteredInputString(htPage, stringName) + $bcParseOnly => + null ncParseFromString string => + htpSetLabelErrorMsg(htPage, '"Syntax Error", '"Syntax Error") + nil + val := checkCondition(htpLabelInputString(htPage, stringName), + string, condList) + STRINGP val => + errorCondition := true + htpSetLabelErrorMsg(htPage, stringName, val) + htpSetLabelSpadValue(htPage, stringName, val) + errorCondition + +checkCondition(s1, string, condList) == + condList is [['Satisfies, pvar, pred]] => + val := FUNCALL(pred, string) + STRINGP val => val + ['(String), :wrap s1] + condList isnt [['isDomain, pvar, pattern]] => + systemError '"currently invalid domain condition" + pattern is '(String) => ['(String), :wrap s1] + val := parseAndEval string + STRINGP val => + val = '"Syntax Error " => '"Error: Syntax Error " + condErrorMsg pattern + [type, : data] := val + newType := CATCH('SPAD__READER, resolveTM(type, pattern)) + null newType => + condErrorMsg pattern + coerceInt(val, newType) + +condErrorMsg type == + typeString := form2String type + if PAIRP typeString then typeString := APPLY(function CONCAT, typeString) + CONCAT('"Error: Could not make your input into a ", typeString) + +parseAndEval string == + $InteractiveMode :fluid := true + $BOOT: fluid := NIL + $SPAD: fluid := true + $e:fluid := $InteractiveFrame + $QuietCommand:local := true + parseAndEval1 string + +parseAndEval1 string == + syntaxError := false + pform := + $useNewParser => + v := applyWithOutputToString('ncParseFromString, [string]) + CAR v => CAR v + syntaxError := true + CDR v + oldParseString string + syntaxError => + '"Syntax Error " + pform => + val := applyWithOutputToString('processInteractive, [pform, nil]) + CAR val => CAR val + '"Type Analysis Error" + nil + +oldParseString string == + tree := applyWithOutputToString('string2SpadTree, [string]) + CAR tree => parseTransform postTransform CAR tree + CDR tree + +makeSpadCommand(:l) == + opForm := CONCAT(first l, '"(") + lastArg := last l + l := rest l + argList := nil + for arg in l while arg ^= lastArg repeat + argList := [CONCAT(arg, '", "), :argList] + argList := nreverse [lastArg, :argList] + CONCAT(opForm, APPLY(function CONCAT, argList), '")") + +htMakeInputList stringList == +-- makes an input form for constructing a list + lastArg := last stringList + argList := nil + for arg in stringList while arg ^= lastArg repeat + argList := [CONCAT(arg, '", "), :argList] + argList := nreverse [lastArg, :argList] + bracketString APPLY(function CONCAT, argList) + + +-- predefined filter strings +bracketString string == CONCAT('"[",string,'"]") + +quoteString string == CONCAT('"_"", string, '"_"") + +$funnyQuote := char 127 +$funnyBacks := char 128 + +htEscapeString str == + str := SUBSTITUTE($funnyQuote, char '_", str) + SUBSTITUTE($funnyBacks, char '_\, str) + +unescapeStringsInForm form == + STRINGP form => + str := NSUBSTITUTE(char '_", $funnyQuote, form) + NSUBSTITUTE(char '_\, $funnyBacks, str) + CONSP form => + unescapeStringsInForm CAR form + unescapeStringsInForm CDR form + form + form + + + + + +@ +\eject +\begin{thebibliography}{99} +\bibitem{1} nothing +\end{thebibliography} +\end{document} |