git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@970 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
=================================================================
 | 
						|
Logtalk - Object oriented extension to Prolog
 | 
						|
Release 2.15.6
 | 
						|
 | 
						|
Copyright (c) 1998-2004 Paulo Moura.  All Rights Reserved.
 | 
						|
=================================================================
 | 
						|
 | 
						|
 | 
						|
% Sending to descendant the message p/1, returns the definition in root:
 | 
						|
 | 
						|
| ?- descendant::p(Value).
 | 
						|
 | 
						|
Value = root
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% Asserting a local definition for p/1 in descendant overrides the inherited 
 | 
						|
% definition:
 | 
						|
 | 
						|
| ?- descendant::(assertz(p(descendant)), p(Value)).
 | 
						|
 | 
						|
Value = descendant
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% If we retract the local definition, again the inherited definition form root
 | 
						|
% will be used:
 | 
						|
 | 
						|
| ?- descendant::(retractall(p(_)), p(Value)).
 | 
						|
 | 
						|
Value = root
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% class does not understand the message p1/1 (the predicate is declared only 
 | 
						|
% for the class descendant instances):
 | 
						|
 | 
						|
| ?- class::p1(X).
 | 
						|
 | 
						|
error(existence_error(predicate_declaration, p1(_)), class::p1(_), user)
 | 
						|
 | 
						|
 | 
						|
% the same message is valid for the class instances:
 | 
						|
 | 
						|
| ?- instance::p1(X).
 | 
						|
 | 
						|
X = class
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% If we assert a clause for a new predicate, p2/1, in the class
 | 
						|
% (a side-effect being a dynamic declaration of the predicate):
 | 
						|
 | 
						|
| ?- class::assertz(p2(class)).
 | 
						|
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% the new predicate, like p1/1, is not available for the class:
 | 
						|
 | 
						|
| ?- class::p2(Value).
 | 
						|
 | 
						|
error(existence_error(predicate_declaration, p2(_)), class::p2(_), user)
 | 
						|
 | 
						|
 | 
						|
% but is available for the class instances, the same way as p1/1:
 | 
						|
 | 
						|
| ?- instance::p2(X).
 | 
						|
 | 
						|
X = class
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% Using a prototype, assert three new predicates (the method object_assert/0 
 | 
						|
% asserts the predicate public_predicate/0 from outside the prototype; the 
 | 
						|
% method self_assert/0 asserts the predicate protected_predicate/0 in self; 
 | 
						|
% the method this_assert/0 asserts the predicate private_predicate/0 in this):
 | 
						|
 | 
						|
| ?- prototype::(object_assert, self_assert, this_assert).
 | 
						|
 | 
						|
yes
 | 
						|
 | 
						|
 | 
						|
% and check the resulting scope of each predicate:
 | 
						|
 | 
						|
| ?- prototype::dynamic_predicates.
 | 
						|
 | 
						|
public_predicate/0 - public
 | 
						|
protected_predicate/0 - protected
 | 
						|
private_predicate/0 - private
 | 
						|
yes
 |