Entraides et échanges autour de la technologie Scol - Informations and exchanges on the Scol technology
Vous pouvez changer la langue de l'interface une fois inscrit - You can change the language once registered
You are not logged in.
long time (for me) and no coding, my brain has been getting out of shape
I've been thinking about how to build a grid of objects in scol, starting (and perhaps ending) with strings in the system console.
This code has two functions.
The first function takes a string element S , an integer I specifying how many times the element is to occur in a list, and returns a list of strings: S R1
proto make_string_list = fun [S [S r1] I ] [S r1];;
The second function takes a list of strings S r1, a multiplier, which counts how many individual strings are to be printed to the console before the console begins writing a new line I, and returns an output string S, which is a grid of the strings written with multiplier I strings per line:
proto build_line_return_string = fun[[S r1] I I S] S;;
Here is the whole package. I figure this could be done in os3d to build grid like structures for fps games or, if the input of each element is varied, to build grid like city structures:
proto build_line_return_string = fun[[S r1] I I S] S;;
proto make_string_list = fun [S [S r1] I ] [S r1];;
fun make_string_list(element, list, iterations) =
let 0 -> counter in
(
while (counter < iterations) do
(
set list = element::list;
set counter=counter+1;
);
);
list;;
fun build_line_return_string (list, multiplier, counter, output_string)=
//end of list, return full string
if ((hd list)== nil) then
(
output_string;
)
else
//not end of list yet
(
if ((mod counter multiplier)==0)
then
(
//add head of list to end of string, add line return since we are at a multiple of multiplier that
//determines line length and
//feed tail of list and changed string back into function
set output_string= strcatn output_string::(hd list):: "\n"::nil;
set counter = counter +1;
build_line_return_string tl list multiplier counter output_string;
)
else
(
//add head of list to end of string followed by a space, feed tail of list
//and changed string back into function
set output_string = strcatn output_string::(hd list)::" "::nil;
set counter = counter +1;
build_line_return_string tl list multiplier counter output_string;
);
);;
fun main()=
_showconsole;
let make_string_list "vv" nil 100-> string_list in
_fooS build_line_return_string string_list 2 1 nil;
0;;
Offline
Hello !
proto build_line_return_string = fun[[S r1] I I S] S;;
proto make_string_list = fun [S [S r1] I ] [S r1];;
fun make_string_list(element, list, iterations) =
let 0 -> counter in
while (counter < iterations) do
(
set list = element::list;
++counter;
);
list;;
fun build_line_return_string (list, multiplier, counter, output_string)=
//end of list, return full string
if ((hd list) == nil) then
output_string
//not end of list yet
else
if ((mod counter multiplier) == 0) then
(
//add head of list to end of string, add line return since we are at a multiple of multiplier that
//determines line length and
//feed tail of list and changed string back into function
set output_string = strcatn output_string::(hd list):: "\n"::nil;
++counter;
build_line_return_string tl list multiplier counter output_string;
)
else
(
//add head of list to end of string followed by a space, feed tail of list
//and changed string back into function
set output_string = strcatn output_string::(hd list)::" "::nil;
++counter;
build_line_return_string tl list multiplier counter output_string;
);;
fun main()=
_showconsole;
let 100 -> iterations in
let make_string_list "vv" nil iterations -> string_list in
_fooS build_line_return_string string_list 7 1 nil;
0;;
I just add few very minor changes. To be continued ...
I don't know what you want to do next...
you can try to write a more polymorphic package: for example, a list of any objects with a tuple of coordinates instead of string ? Or not ! Cool to see you again
Offline
thanks for that ++ insertion Iri.
A question...is there a way to add an element to the end of a list as opposed to the beginning (I've done some looking on redmine to see if the function is in one of the libraries but haven't found it):
If I change
set list = element::list;
to
set list = list::element;
scol throws an error, I assume because I am adding an element that comes after the end of the tail of the list, which is nil.
(!) Line #11:
list??;;
>>> ERROR - Type mismatch (detail):
Found: fun [S [S r1] I] [S r1]
Expected: fun [[[r1 r1] r1] [r1 r1] I] [r1 r1]
I'm also curious as to what:
Expected: fun [[[r1 r1] r1] [r1 r1] I] [r1 r1]
means. r1 states the type of recursivity. how can you have recursivity of recursivity? i thought recursivity is only a property of elements, such as S, I, F, user_defined_struct, etc. But recursivity of recursivity? I'm mystified. Sounds like something out of Godel's Theorem.
a list of any objects with a tuple of coordinates instead of string
yes that would be a great idea for creating endless cities. something where you create a grid of square shaped So3 scene nodes (randomly drawn from an array different meshes, all formed so that they can seamlessly join to one another), resize if needed, and then go explore, something like a less spectacular version of 4'10" of this (made with non realtime mandelbulb...https://www.youtube.com/watch?v=PWMTDRWJqu4 )
Last edited by hebdemnobad (19-Nov-2018 15:59:47)
Offline
scol throws an error, I assume because I am adding an element that comes after the end of the tail of the list, which is nil.
Yes.
I'm also curious as to what:
Expected: fun [[[r1 r1] r1] [r1 r1] I] [r1 r1]
The compiler is too crazy sometimes ...
[r1 r1] does not exist. It's senseless.
A recursivity level 2 can be exist (even level n but this is no utility in practice). By example : [S I r2]
To add an element at the end, you can see in 'lib/std/list.pkg' : there is not function for that but std_lApplyFunc could be a start.
Offline
I think a simple shortcut would be
1. turn the new string element into an S r1 list like this where String_element is a string and Lfirst_list is an [S r1] list:
2. join old list to new list sing os3d list function lcat (p ,q )
3. return old list+new list
fun add_to_end_of_list (first list, String_element)=
//step 1
let String_element::nil-> last_list in
// step 2
lcat Lfirst_list last_list;;
I'll try this when I have time.
Last edited by hebdemnobad (19-Nov-2018 16:41:29)
Offline