Navigation
Synopsis A Lisp pretty printer.
Description The purpose of a pretty printer is to convert an internal structure to text. We define here the simplest possible solution:
module demo::lang::Lisra::Pretty

import demo::lang::Lisra::Runtime;

// Pretty print: transform an Lval to a string
public str pretty(Integer(n))  = "<n>";
public str pretty(Atom(name))  = name;
public str pretty(List(elms*)) = "( <for(e <- elms){><pretty(e)> <}>)";
public str pretty(Closure(Result(list[Lval] args, Env env))) = "Closure(<args>)";
Compare the definition of pretty with that of parse:
Lval parse(str txt);
str pretty(Lval x);
For a well-designed pair of parse/pretty functions, the latter is the inverse of the former. In other words, for every L the following should hold:
parse(pretty(L)) == L
Examples
rascal>import demo::lang::Lisra::Runtime;
ok
rascal>import demo::lang::Lisra::Pretty;
ok
rascal>pretty(Integer(42));
str: "42"
rascal>pretty(Atom("x"));
str: "x"
rascal>L = List([Atom("+"), Integer(5), Integer(7)]);
Lval: List([
    Atom("+"),
    Integer(5),
    Integer(7)
  ])
rascal>pretty(L);
str: "( + 5 7 )"
Now let's explore whether pretty is indeed the inverse of parse:
rascal>import demo::lang::Lisra::Parse;
ok
rascal>parse(pretty(L)) == L;
bool: true
Is this page unclear, or have you spotted an error? Please add a comment below and help us to improve it. For all other questions and remarks, visit ask.rascal-mpl.org.