load "../logo/types.lg to pr_str :exp :readable if emptyp :exp [output []] output case obj_type :exp [ [[nil] "nil] [[true] "true] [[false] "false] [[number] obj_val :exp] [[symbol] obj_val :exp] [[keyword] word ": obj_val :exp] [[string] print_string :exp :readable] [[list] pr_seq obj_val :exp :readable "\( "\) :space_char] [[vector] pr_seq obj_val :exp :readable "\[ "\] :space_char] [[hashmap] pr_seq obj_val :exp :readable "\{ "\} :space_char] [[atom] (word "\(atom :space_char pr_str obj_val :exp :readable "\) ) ] [[nativefn] (word "#) ] [[fn] (word "#) ] [else (throw "error (sentence [unknown type] obj_type :exp))] ] end to escape_string :s localmake "i 1 localmake "res " while [:i <= count :s] [ localmake "c item :i :s make "res word :res cond [ [[ :c = "\\ ] "\\\\ ] [[ :c = char 10 ] "\\n ] [[ :c = "\" ] "\\\" ] [else :c ] ] make "i (:i + 1) ] output :res end to print_string :exp :readable ifelse :readable [ output (word "\" escape_string obj_val :exp "\" ) ] [ output obj_val :exp ] end to pr_seq :seq :readable :start_char :end_char :delim_char localmake "res :start_char foreach :seq [ if # > 1 [make "res word :res :delim_char] make "res word :res pr_str ? :readable ] output word :res :end_char end