users-prolog
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Predicate searching by wildcard or similar


From: Daniel Diaz
Subject: Re: Predicate searching by wildcard or similar
Date: Wed, 06 Nov 2013 17:06:46 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.1.0

Hi Sean,

you can use current_predicate to get the Name/Arity of present predicates and then test the Name.
For instance, to get a predicate starting with 'test_' you can use the following (reexecutable by backtracking) :

| ?- current_predicate(Name/_Arity), atom_concat('test_', _, Name).

Name = test_blabla1 ;
Name = test_blabla2 ;
...

You can then collect them in a list L with:

| ?- findall(Name, (current_predicate(Name/_Arity), atom_concat('test_', _, Name)), L).

L = [test_blabla1,test_blabla2,...]

To check if the name ends by '_test' simply  use atom_concat(_, '_test', Name).

If you want to only collect predicates without arguments simply replace _Arity by 0.

Daniel


Le 05/11/2013 22:27, Sean Charles a écrit :
Hi,

I just wrote a *really simple* testing framework for my project, it looks like this at the test script end:

test_package([it('should ensure that global values have expected settings', defaults_correctly_set_test)
    ,it('should correctly set the quiet flag on "-q"', respect_quiet('-q'))
    ,it('should correctly set the quiet flag on "--quiet"', respect_quiet('--quiet'))
    ,it('should correctly set the wrap flag on "--wrap"', respect_wrap)
    ,it('should correctly set the check flag on "--nocheck"', respect_check)
    ,it('should add unhandled options as source filenames', filename_check)
    ,it('should throw exceptions on unknown options', handle_unknown_options)
    ]).

The test_package predicate is called from the framework by the script, the script pulls in the file and that has an initialisation instruction:

:- initialization(run_tests).

run_tests :-
test_package(AllTests),
maplist(call, AllTests),
ink(normal, '*done*'),
stop.


What would have made it *really* nice was to have been able to find all predicates starting with test_ or ending with _test etc. so that I would not have needed to make the test_package predicate unify the variable with the list of tests to be run. Some tests mentioned above...

defaults_correctly_set_test :-
cl_set_defaults,
get_all_globals([],[],user_input,user_output,php,nowrap,check,plain,noisy).


respect_quiet(Flag) :-
cl_set_defaults,
process_option(Flag),
get_all_globals(_,_,_,_,_,_,_,_,quiet).


As you can see, having to enter the test predicate AND enter it in the test package isn’t ideal ALTHOUGH it does allow me to provide a nice label but I could have done that with a really long predicate name anyway.

So, how would I do that in GNU Prolog…if it is possible. The listing() predicate is not much help in this instance…

Thanks,
Sean.


--
Ce message a été vérifié par MailScanner pour des virus ou des polluriels et rien de suspect n'a été trouvé.

_______________________________________________
Users-prolog mailing list
address@hidden
https://lists.gnu.org/mailman/listinfo/users-prolog


--
Ce message a été vérifié par MailScanner pour des virus ou des polluriels et rien de suspect n'a été trouvé.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]