Serge D. Mechveliani wrote:
>
> People,
> I have questions about the below Spad program and its strange compilation:
>
> ------------------------------------------------- t.spad ------
> OF ==> OutputForm
> INT ==> Integer
> CharList ==> List Character
> Lexeme ==> String
> LexList ==> List String
> NLSTR ==> newline() :: String
> NLOF ==> newline() :: OutputForm
>
> )abbrev package DLIST1 DList1
> DList1(T : Type) : with
> lPair : (List T, List T) -> Product(List T, List T)
> ==
> add
> ListPair ==> Product(List T, List T)
>
> lPair(xs : List T, ys : List T) : ListPair ==
> construct(xs, ys) $ ListPair
>
> )abbrev package HASHTAB1 HashTable1
> HashTable1(Key : SetCategory, Val : SetCategory) : with
>
> MbVal ==> Union(Val, "failed")
> MbList ==> Union(List Val, "failed")
> HashTab ==> HashTable(Key, Val, String)
>
> searchMany : (List Key, HashTab) -> MbList
> searchMany : (List Key, HashTab) -> List Val
> ==
> add
> searchMany(keys : List Key, tab : HashTab) : MbList ==
>
> -- returns "failed" iff any of keys is not in tab
>
> mbs := map(k +-> search(k, tab), keys)
> any?(x +-> x case "failed", mbs) => "failed"
> map(x +-> x :: Val, mbs) :: MbList
>
> searchMany(keys : List Key, tab : HashTab) : List Val ==
>
> -- breaks iff any of keys is not in tab
> msg() : Void ==
> oF := hconcat["searchMany ", keys :: OF, NLOF, " tab :"]
> print(oF)$OF
> mbL := searchMany(keys, tab) @ MbList
> mbL case "failed" =>
> (msg(); error "some key is not in the table.")
> mbL :: List Val
>
>
> )if false
> parseINT ==> READ_-FROM_-STRING
>
> )abbrev package DCHAR1 DChar1
> DChar1() : with
> mapChar : (String -> Character, List String) -> CharList
> parenthesesF : () -> CharList
> ==
> add
> mapChar(f : String -> Character, xs : List String) : CharList ==
> map(f, xs) $ ListFunctions2(String, Character)
>
> parenthesesF() : CharList ==
> mapChar(char, ["(", ")", "[", "]", "{", "}"])
> )endif
> --------------------------------------------------------------
>
>
>
> 1.
> FriCAS-1.1.6 (SBCL 1.0.55) reports
>
> ------------------------------------------------------------
> ...
> DList1 will be automatically loaded when needed from
> /home/mechvel/haxiom/fromA-aim/DLIST1.NRLIB/DLIST1
>
> HASHTAB1 abbreviates package HashTable1
> ******** Boot Syntax Error detected ********
> The prior line was:
> 21> HashTable1(Key : SetCategory, Val : SetCategory) : with
>
> The current line is:
> 23> (MbVal ==> Union(Val, "failed");
> ^
> First currently preparsed lines are:
> 24> MbList ==> Union(List Val, "failed");
> 25> HashTab ==> HashTable(Key, Val, String);
> 27> searchMany : (List Key, HashTab) -> MbList;
> 28> searchMany : (List Key, HashTab) -> List Val)
> 29> ==
>
> The number of valid tokens is 1.
> The prior token was #S(TOKEN :SYMBOL |MbVal| :TYPE IDENTIFIER :NONBLANK T)
> The current token is #S(TOKEN :SYMBOL ==> :TYPE KEYWORD :NONBLANK NIL)
> ******** Boot Syntax Error detected ********
> ------------------------------------------------------------
>
>
> After un-commenting the trailing fragment of
>
> )if false
> ...
> )endif
>
> the program is compiled! What is the difference?
>
No, I still get an error. You probably missed error message because
messages from (successful) compilation of the last part filled
the screen so that error message scrolled above visible area.
If your terminal has enough scrolback you should be able to
see that error messages are still there.
>
> 2.
> In the above package HashTable1(Key: SetCategory, Val: SetCategory) ...
> I write
>
> MbVal ==> Union(Val, "failed")
> MbList ==> Union(List Val, "failed")
> HashTab ==> HashTable(Key, Val, String)
> searchMany : (List Key, HashTab) -> MbList
> ...
> ==
> add
> ...
>
> -- with this precise indentation. Because I want to
> (a) make these 3 macros local in the package: not visible from outside
> (because Key and Val are local),
> (b) to use these macros in the signature of searchMany -- before the
> implementation part.
>
> What may be a correct syntax to arrange this?
I am not sure if something like your syntax should be allowed.
The current way is:
HashTable1(Key: SetCategory, Val: SetCategory): Exports == Implementation where
MbVal ==> Union(Val, "failed")
....
Exports ==> with
searchMany : (List Key, HashTab) -> MbList
searchMany : (List Key, HashTab) -> List Val
Implementation ==> add
searchMany(keys : List Key, tab : HashTab) : MbList ==
...
...
'where' starts new lexical environment such that things defined there
are available to left argument of 'where' but invisible outside of
it.
--
Waldek Hebisch
[email protected]
--
You received this message because you are subscribed to the Google Groups
"FriCAS - computer algebra system" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/fricas-devel?hl=en.