On 16/08/2013 01:47, Volkan Unsal wrote: > Being new to Eclipse, I am trying to understand some basic concepts. I > don't understand why are some Eclipse predicates not available from inside > loops. For example: > > # test.ecl > main :- > (foreach(A,[1,2]) do > Z is string(A), > writeln( Z ) > ). > If you have Z is string(A) outside a loop, you would get the same error. The problem you are seeing is because is/2 expects an arithmetic expression on the right-hand side, and if you look at the documentation for is/2 (which you can get by "help is/2" at the top-level): > This evaluation mechanism outlined above is not restricted to the > predefined arithmetic functors shown in the table. In fact it works for > all atoms and compound terms. It is therefore possible to define a new > arithmetic operation by just defining an evaluation predicate. > Similarly, many ECLiPSe built-ins return numbers in the last argument > and can thus be used as evaluation predicates (e.g.cputime/1, random/1, > string_length/2, ...). Note that recursive evaluation of arguments is > only done for the predefined arithmetic functions, for the others the > arguments are simply passed to the evaluation predicate. So string(A) is treated as a call to a predicate string/2, which is not defined, as reported by the error message you saw: > $ eclipse -b test.ecl -e main > calling an undefined procedure string(1, _105343) in module eclipse > abort > > These are available from the command line when I query the data, but not > from within the program. How do I do type checking on the variables if I > can't use these...? is/2 is intended (as in other Prologs) for evaluating an arithmetic expression. If you want to do type checking, you should not put the type check predicate on the rhs of is/2. You should just call it, e.g. (foreach(A, As) do string(A)) > Almost exactly the same problem with comparison operators: > > fn1 :- > (foreach(A,[1,2]) do > Z is compare("<", A, 1), > writeln( Z ) > ). > %% calling an undefined procedure compare("<", 1, 1, _103944) in module > eclipse > %% abort > Again, you should just have compare("<", A, 1) on its own, although here you can write: 1 is compare("<", A) because the last argument does return a number. Cheers, KishReceived on Fri Aug 16 2013 - 17:42:33 CEST
This archive was generated by hypermail 2.3.0 : Wed Sep 25 2024 - 15:13:21 CEST