Reading terms from strings

Author(s): Francisco Bueno, Daniel Cabeza, Manuel Hermenegildo, Jose F. Morales.

This module implements predicates for reading (parsing) terms from strings or atom codes.

Use with extreme care. This is a quick and incomplete implementation.

Usage and interface

Documentation on exports

PREDICATE

Usage:read_from_string(String,Term)

Read a term Term from String.

  • The following properties should hold at call time:
    (term_typing:nonvar/1)String is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.

PREDICATE

Usage:read_from_string(String,Term,Rest)

Read a term Term from String up to Rest (which is the non-parsed rest of the list).

  • The following properties should hold at call time:
    (term_typing:nonvar/1)String is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.

PREDICATE

Usage:read_from_string_opts(String,Term,Rest,Opts)

String is parsed into Term up to Rest (which is the non-parsed rest of the list). The options in Opts can be:

variable_names(Ns)
Read variable names in Ns.

  • The following properties should hold at call time:
    (term_typing:nonvar/1)String is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.
    (term_typing:nonvar/1)Opts is currently a term which is not a free variable.

PREDICATE

Usage:read_from_string_atmvars(String,Term)

Read a term Term from String. It ignores the unparsed rest of the string (see read_from_string_atmvars/3).

  • The following properties should hold at call time:
    (term_typing:nonvar/1)String is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.
General properties:

Test:read_from_string_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[97]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=a

Test:read_from_string_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[49]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=1

Test:read_from_string_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[65]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=A

Test:read_from_string_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[102,40,97,41]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=f(a)

Test:read_from_string_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[102,47,50]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=f/2

PREDICATE

Usage:read_from_string_atmvars(String,Term,Rest)

Read a term Term from String up to Rest (which is the non-parsed rest of the list). Unquoted uppercase identifiers are read as atoms instead of variables (thus, the read term is always ground).

  • The following properties should hold at call time:
    (term_typing:nonvar/1)String is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.
General properties:

Test:read_from_string_atmvars(A,T,R)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[102,40,97,41]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=f(a)
    (term_basic:= /2)term_basic:R=[]

Test:read_from_string_atmvars(A,T,R)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=[102,40,97,41,32,102,111,111,32]
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=f(a)
    (term_basic:= /2)term_basic:R=[32,102,111,111,32]

PREDICATE

Usage:read_from_atom_atmvars(Atom,Term)

Like read_from_string_atmvars/2, but reads the term Term from the atom codes in Atom.

  • The following properties should hold at call time:
    (term_typing:nonvar/1)Atom is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.
General properties:

Test:read_from_atom_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=a
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=a

Test:read_from_atom_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=1
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=1

Test:read_from_atom_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=A
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=A

Test:read_from_atom_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=f(a)
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=f(a)

Test:read_from_atom_atmvars(A,T)

  • If the following properties hold at call time:
    (term_basic:= /2)term_basic:A=f/2
    then the following properties should hold upon exit:
    (term_basic:= /2)term_basic:T=f/2

PREDICATE

Usage:read_from_atom(Atom,Term)

Read the term Term from the atom codes in Atom.

  • The following properties should hold at call time:
    (term_typing:nonvar/1)Atom is currently a term which is not a free variable.
    (term_typing:var/1)Term is a free variable.

Known bugs and planned improvements

  • All predicates except read_from_atom/2 were implemented as a quick hack initially written mainly for parsing daVinci's messages. The good implementation should: a) create a read stream from a string, and b) call the standard reader.
  • read_from_atom/2 is implemented using pipe/2, which has deadlock problems (IO is synchronous and pipe buffer size is limited)