Dictionaries and ('.')/2

I am writing some code that make heavy use of dictionaries, to provide kind of fluent interface (not to be mixed up with SWI-Prolog fluent). However “non-functional” calls like Var.pretty_print() are currently not expanded. Is there a good reason why this isn’t supported?

Because it’s not a function (or a predicate) call? – It’s a term.

This should work:

call(Var.pretty_print)

although its expansion isn’t the most efficient:

call(( '.'(Var, pretty_print, A), call(A))).

and call(Var.pretty_print, Arg) isn’t supported. :frowning:

Thanks for the hint, I now realized that foo{}.bar() actually isn’t infix syntax for '.'(foo{}, bar()), but it actually expands to:

'.'(foo{}, bar(), A),
call(A).

So there is a somewhat hacky way of defining:

foo:debug(Dict, Impl) :-
  Impl = format("Printing ~w", [Dict]).

then

test :-
  foo{a: 1, b: 2}.debug().

works :slight_smile: However the expansion works differently in the interactive mode and fails with Unknown procedure: ('.')/2