Печать дерева
От: varenikAA  
Дата: 25.09.19 12:50
Оценка:
using System;
using System.Console;

variant Node {
    | Text {text : string}
    | Element { name : string; nodes : list[Node] }
}

def print(tree, add) {
    match(tree) {
        | Node.Text(text) => {
            WriteLine();
            foreach(_ in [0..add])
                Write(" ");    
            Write("(" + text);
        }
        | Node.Element(name, nodes) => {
            WriteLine();
            foreach(_ in [0..add])
                Write(" ");  
            Write("(" + name);
            foreach(node in nodes)
                print(node, add + 4);
        }
    }
    Write(")");
}
def println(tree, add) {
    print(tree, add);
    WriteLine();
}
println(Node.Element("root", 
[Node.Element("branches", 
[Node.Element("name", 
[Node.Text("Alice")]),
Node.Element("name", [Node.Text("Bob")])])]),0);


Получилось:

 (root
     (branches
         (name
             (Alice))
         (name
             (Bob))))


Так норм?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Печать дерева
От: DarthSidius  
Дата: 29.09.19 17:39
Оценка:
Здравствуйте, varenikAA, Вы писали:

using System;
using System.Console;
using System.Linq;

variant Node {
    | Text {text : string}
    | Element { name : string; nodes : list[Node] }
}

def print(tree, add) {
    def отступ()
    {
        WriteLine();
        Write(string.Concat(Enumerable.Repeat(' ', add)))
    }
    match(tree) {
        | Node.Text(text) => {
            отступ();
            Write("(" + text);
        }
        | Node.Element(name, nodes) => {
            отступ();
            Write("(" + name);
            foreach(node in nodes)
                print(node, add + 4);
        }
    }
    Write(")");
}
def println(tree, add) {
    print(tree, add);
    WriteLine();
}
println(Node.Element("root", 
[Node.Element("branches", 
[Node.Element("name", 
[Node.Text("Alice")]),
Node.Element("name", [Node.Text("Bob")])])]),0);
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
♠♠♥♠♠♦♥
Re[2]: Печать дерева
От: varenikAA  
Дата: 30.09.19 13:59
Оценка:
Здравствуйте, DarthSidius, Вы писали:
using System;
using System.Console;
using System.Linq;

variant Node {
    | Text {text : string}
    | Element { name : string; nodes : list[Node] }
}

def print(tree, add) {
    WriteLine();
    Write(string.Concat(Enumerable.Repeat(' ', add)))
    match(tree) {
        | Node.Text(text) => {
            Write("(" + text);
        }
        | Node.Element(name, nodes) => {
            Write("(" + name);
            foreach(node in nodes)
                print(node, add + 4);
        }
    }
    Write(")");
}
print(Node.Element("root", 
[Node.Element("branches", 
[Node.Element("name", 
[Node.Text("Alice")]),
Node.Element("name", [Node.Text("Bob")])])]),0);
WriteLine();
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re: Печать дерева
От: _NN_ www.nemerleweb.com
Дата: 21.10.19 07:33
Оценка:
Здравствуйте, varenikAA, Вы писали:

AA> foreach(_ in [0..add])

repeat(add)


Советую ещё посмотреть на выражение ..$(list; separator; func) и StringTemplate:


https://github.com/rsdn/nemerle/blob/master/testsuite/positive/string-template-1.n
https://github.com/rsdn/nemerle/blob/master/testsuite/positive/string-template-2.n
https://github.com/rsdn/nemerle/blob/master/testsuite/positive/string-template-3.n
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.