:- use_module(library(python)).

:- initialization(main).

main :- 
	ex(X),
	flush_output,
	fail.
main.

%
% strings are atoms in the interface
% with usual properties
%
% variables must be used with $
%
% UNICODE is supposed to work (does in Linux).
%
ex(currency) :-
	(
	    currency := '€',
	    O := ord($currency),
	    X := $currency,
	    L := len($currency),
	    format('currency=~a ~d/~d~n',[X, O, L])
	->
	    true
	;
	    failed(currency)
	).

ex(home) :-
	(
	    filename := os:environ:get('HOME')
	->
	    X := $filename,
	    format('HOME=~a~n',[X])
	;
	    true
	).

ex(site) :-
	X := site:getusersitepackages(_),
	format('site packages=~a~n',[X]).

ex(arith) :-
	A := 2+2,
	B := (50-5*6)/4,
	C := 7/3,
	width := 20,
	height := 5*9,
	D := $width* $height,
	format('arith=~d ~d ~d ~d~n',[A,B,C,D]).

ex(undefined) :-
	format('undefined variable~n', []),
	X := $n,
	format('undefined=~d',[X]).

ex(fp) :-
	X := 3 * 3.75 / 1.5,
	Y := 7.0 / 2,
	format('fp=~f ~f~n',[X,Y]).

ex(complex) :-
	A := complex(0,1) * complex(0,1),
	B := complex(3,1)*3,
	a := complex(1.5,0.5),
	R := $a:real,
	I := $a:imag,
	format('complex=~w ~w ~w+~wj~n',[A,B,R,I]).

ex(floatint) :-
	A := float(22000),
	B := int(3.1),
	C := long(15000000.5),
	format('cast=~w ~w ~w~n',[A,B,C]).

ex(strings) :-
	S1 := 'spam eggs',
	S2 := 'doesn\'t',
	S3 := '"Yes," he said.',
	S4 := '"Isn\'t," she said.',
	format('s=~a ~a ~a ~a~n',[S1,S2,S3,S4]),
	hello := 'This is a rather long string containing\n\
several lines of text just as you would do in C.\n\
    Note that whitespace at the beginning of the line is\
 significant.',
	python_command('print hello'),
	X := $hello,
	format('s=~a~n',[X]).

ex(strings2) :-
	word := 'Help' + 'A',
	X := '<' + $word*5 + '>',
	Y := (str:strip) + ing,
	A1 := $word^[4],
	A2 := $word^[0:2],
	A3 := $word^[2:4],
	format('concat=~a ~a ~a ~a ~a~n',[X,Y,A1,A2,A3]).

ex(slices) :-
	s := 'supercalifragilisticexpialidocious',
	L := len($s),
	S1 := $s^[1:6],
	S2 := $s^[-6: -1],
	S3 := $s^[_:6],
	S4 := $s^[-6:_],
	format('slices=~d ~a ~a ~a ~a~n',[L,S1,S2,S3,S4]).


ex(lists) :-
	a := [66.25, 333, 333, 1, 1234.5],
        A1 := $a:count(333), A2 := $a:count(66.25), A3 := $a:count(x),
	format('counts=~d ~d ~d~n',[A1,A2,A3]),
	:= $a:insert(2, -1),
	:= $a:append(333),
	A := $a,
	format('a=~w~n', [A]),
	I := $a:index(333),
	:= $a:remove(333),
	B := $a,
	format('a=~w~n', [B]),
	:= $a:reverse(_),
	C := $a,
	format('a=~w~n', [C]),
	:= $a:sort(_),
	D := $a,
	format('a=~w~n', [D]).

ex(iter) :-
	it := iter(abc),
	format('iter= ', []),
	iterate(iter).

iterate(iter) :-
	repeat,
	( X1 := $it:next,
	  format('i ~a~n', [X1])
	->
	  fail
	;
	  !
	).

ex(range) :-
	r1 := range(1000),
	r2 := range(1000,2000),
	r3 := range(2000,10000,1),
	S := sum($r1+ $r2+ $r3),
	format('range=~d~n', [S]).