Re: [Seed7-users] [Upd] Beginners questions and example
Interpreter and compiler for the Seed7 programming language.
Brought to you by:
thomas_mertes
From: Thomas M. <tho...@gm...> - 2014-10-05 08:39:32
|
On Sat, Oct 04, 2014 at 17:26 "Arkadiy Kuleshov" <ark...@ya...> wrote: > Hello Seed7 Users. > > Let me express my thanks to Thomas for creating such a fantastic language! You're welcome! > Flexbility of the language is something I want to explore. Right now I am still at the beginning > of mastering seed7 and using my own syntax may be next step. > > Please find attached a Prim's minimum spanning tree implementation as described at this link: > http://algs4.cs.princeton.edu/43mst/ > This is my first complete program in Seed7 and I am asking for a brief code review from anyone. > Basically there are separate files for heap operations and minimum priority queue operations. Thank you very much for your example. Currently I am very busy, but I will have a look at your example later. > Here are some questions. > > 1. When using pointers, is the syntax ^ to dereference still supported? It is mentioned in the manual. In the early days of Seed7 I introduced pointers with the ^ symbol to deference. But I never introduced a concept to allow a struct that can contain a pointer that points to itself. I recognized that I can do all the things needed without pointers. Instead of pointer lists and trees I use containes like arrays and hash tables. As a consequence the example programs do not use pointers (except for wiz.sd7, but I plan to remove it from wiz.sd7 also). Pointers can be replaced with OO methods: http://seed7.sourceforge.net/manual/objects.htm#replacing_pointers I consider pointers as the goto of data. Like structured programming avoids goto statements with structured statements (if, case, while, repeat, for, etc.) it should be possible to avoid pointers with structured data (struct, array, hash, set, etc.). A priority queue is currently mising in Seed7. Can you license your include files with LGPL and your program with GPL? That way it can be added to the Seed7 release? > Also, if I need to create an array of structures and later use pointers to them, what is the best way to do so: > create a normal array of values and then create a pointer to each element using & syntax, or > create an array of pointers and use varalloc to create each element? > What is the difference between varalloc and xalloc? Varalloc and xalloc have been temporary solutions and I have replaced most uses with the function toInterface (see its usage in external_file.s7i). If you really need something similar to pointers use interface and implementation types (see: http://seed7.sourceforge.net/manual/objects.htm). Hopefully it is possible to avoid pointers in an priority queue implementation (Since I am busy with the database drivers now I did not have the time too look into your code). > 2. Can I use template functions to declare new structures and functions on them, such as > described here? http://seed7.sourceforge.net/examples/for_decl.htm > My intention was to declare a generic "new struct" using the same approach but it didn't work > and the error message had "declared twice" information. Structs are already defined as template (generic type) in the file struct.s7i. Maybe you can introduce a template (e.g.: EXTEND_STRUCT with a struct type as parameter) to add functionality to the current struct implementation. > 3. Why do I get the following message when using "in" parameter (probably instead of a "var") > *** minpq.s7i(135):52: Variable expected in {SCT_SELECT({pq . count }) decr } found expression ({pq . count }) of type func integer > decr(pq.count); An 'in' parameter behaves like a constant and the function 'decr' trys to change it. If you use an 'in var' parameter instead it can be changed with 'decr' but the change does not effect the actual parameter (it just happens in the function). I you use an 'inout' parameter instead of an 'in' parameter the function 'decr' can change it and the change takes effect inside and outside the function (the actual parameter is changed also). > 4. The manual mentions that you can implement "doMap" function without lambda expressions. > http://seed7.sourceforge.net/examples/map.htm > But the syntax > > doMap([](1, 2, 4, 6, 10, 12, 16), x, x + 1) > > looks very much like a lambda expression. A lamda encodes parameter name(s) and expression together. Without lamda it is necessary that doMap gets parameter name(s) and expression as saparate parameters. > Could you give more examples on programming using "map", "reduce", "filter", etc? I assume that filter keeps elements that fulfill a condition: const func array integer: doFilter (in array integer: anArray, inout integer: aVariable, ref func boolean: aCondition) is func result var array integer: mappedArray is 0 times 0; begin for aVariable range anArray do if aCondition then mappedArray &:= aVariable; end if; end for; end func; I could be used with: doFilter([](1, 2, 4, 6, 10, 12, 16), x, x < 10) which returns [](1, 2, 4, 6) > Is it possible to apply functions to other data types in addition to arrays? There is no supertype for all containers (that has array as subtype). If such a supertype existed it would be possible. > 5. Attached file minpq_err.s7i causes interpreter to emit segmentation fault when included from any other file. > I think it is because same identifier "item" is used for both a variable name and type name. That could be. But since the variable "item" is local it should not make problems. I will look at this when I have more time. > Instructions: > > Place all attached files into seed7/prg or your programs folder. > Copy the text in the P.S. into graph1.txt > > Run "./s7 prims.sd7 graph1.txt" This happens when I call prims: tm@penguin ~/Downloads $ s7 prims graph1.txt SEED7 INTERPRETER Version 5.0.5687 Copyright (c) 1990-2014 Thomas Mertes graph1.txt No. of vertices is 6 No. of edges is 7 Got edge # 1 (1,2) with weight 2474 Got edge # 2 (2,4) with weight -246 Got edge # 3 (4,3) with weight 640 Got edge # 4 (4,5) with weight 2088 Got edge # 5 (3,6) with weight 4586 Got edge # 6 (6,5) with weight 3966 Got edge # 7 (5,1) with weight -3824 Read graph with 6 vertices and 7 edges Running Prim's MST algorithm pop (1, 0) add (2, 2474) add (5, -3824) Heap (6) is 5:-3824, 2:2474, 3:2147483647, 4:2147483647, 1:2147483647, 6:2147483647 ... pop (5, -3824) add (4, 2088) add (6, 3966) Heap (5) is 4:2088, 2:2474, 3:2147483647, 1:2147483647, 6:3966 ... pop (4, 2088) add (2, -246) add (3, 640) Heap (4) is 2:-246, 6:3966, 3:640, 1:2147483647 ... pop (2, -246) Heap (3) is 3:640, 6:3966, 1:2147483647 ... pop (3, 640) Heap (2) is 6:3966, 1:2147483647 ... pop (6, 3966) Heap (1) is 1:2147483647 ... Cost of MST with size 5 is 2624 -------------------------------------------------------- Is that correct? Hopefully my answers are helpful. Regards, Thomas Mertes -- Seed7 Homepage: http://seed7.sourceforge.net Seed7 - The extensible programming language: User defined statements and operators, abstract data types, templates without special syntax, OO with interfaces and multiple dispatch, statically typed, interpreted or compiled, portable, runs under Linux/Unix/Windows. |