Skip to content

Instantly share code, notes, and snippets.

@tani
Created May 22, 2021 12:04
Show Gist options
  • Save tani/7de0b599fcc5b1c750887a032db41567 to your computer and use it in GitHub Desktop.
Save tani/7de0b599fcc5b1c750887a032db41567 to your computer and use it in GitHub Desktop.
#lang racket
(require srfi/1)
(define (walk-bfs-n node)
;; ((walk-bfs-n '(a (b c d) e)) list)
(lambda (k)
(if (list? node)
(let* ((label (first node))
(nodes (rest node))
(labels (map (lambda (node) (call/cc (walk-bfs-n node))) nodes)))
(append labels (k label)))
(k node))))
(define (walk-dfs-n node)
;; (call/cc (walk-dfs-n '(a (b c d) e)))
(lambda (k)
(if (list? node)
(let* ((label (car node))
(nodes (cdr node))
(seqs (map (lambda (node) (call/cc (walk-dfs-n node))) nodes)))
(k (apply append (list label) seqs)))
(k (list node)))))
(define (tree->seq node i)
;; i is a index
(if (list? node)
(let* ((label (car node))
(children (cdr node))
(recur (lambda (elm acc)
(let ((j (+ (car (last (last acc))) 1)))
(append acc (list (tree->seq elm j))))))
(initial (list (tree->seq (car children) (+ i 1))))
(seqs (foldl recur initial (cdr children)))
(tags (map caar seqs)))
(cons (cons* i label tags) (apply append seqs)))
(list (list i node))))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment