mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Remove sample for now until test structure changes
This commit is contained in:
		| @@ -1,69 +0,0 @@ | |||||||
| :- module(mavis, [the/2]). |  | ||||||
| /** <module> Optional type declarations |  | ||||||
|  |  | ||||||
| The =mavis= module (because she helps with typing ;-) allows one to |  | ||||||
| give optional type declarations to Prolog code. During *development*, |  | ||||||
| these declarations throw informative exceptions if values don't match |  | ||||||
| types. In *production*, the declarations do nothing. |  | ||||||
|  |  | ||||||
| ---+ Why? |  | ||||||
|  |  | ||||||
| We love dynamic types. That's one reason we love Prolog. But sometimes |  | ||||||
| types are a helpful tool.  They can: |  | ||||||
|  |  | ||||||
|   * offer documentation to those reading our code |  | ||||||
|   * help find errors during development |  | ||||||
|   * structure our thinking during development |  | ||||||
|   * provide data for static analysis tools |  | ||||||
|  |  | ||||||
| ---+ How? |  | ||||||
|  |  | ||||||
| Mavis types are defined using error:has_type/2. We might define an |  | ||||||
| =even_integer= type with |  | ||||||
|  |  | ||||||
| == |  | ||||||
| error:has_type(even_integer, X) :- |  | ||||||
|     0 is X mod 2. |  | ||||||
| == |  | ||||||
|  |  | ||||||
| Our code can use that definiton like |  | ||||||
|  |  | ||||||
| == |  | ||||||
| %% frobnify(+A, -B) |  | ||||||
| frobnify(A, B) :- |  | ||||||
|     the(integer, A), |  | ||||||
|     the(even_integer, B), |  | ||||||
|     B is 2*A. |  | ||||||
| == |  | ||||||
|  |  | ||||||
| We can declare types for bound variables, like =A=, and |  | ||||||
| not-yet-bound variables, like =B=. The type constraints are implemented |  | ||||||
| with freeze/2 so they apply as soon as a variable is bound. |  | ||||||
|  |  | ||||||
| To disable type checking in production, start Prolog with the |  | ||||||
| =|-O|= command line argument. A macro eliminates calls to the/2 so they |  | ||||||
| have no runtime overhead. |  | ||||||
|  |  | ||||||
| @author Michael Hendricks <michael@ndrix.org> |  | ||||||
| @license BSD |  | ||||||
| */ |  | ||||||
|  |  | ||||||
| %%  the(+Type, ?Value) is det. |  | ||||||
| % |  | ||||||
| %	Declare that Value has the given Type. |  | ||||||
| %	Succeeds if Value is bound to a value that's compatible |  | ||||||
| %	with Type.  Throws an informative exception if Value |  | ||||||
| %	is bound to a value that's not compatible with Type. |  | ||||||
| %	If Value is not bound, the type check is delayed until |  | ||||||
| %	Value becomes bound. |  | ||||||
| % |  | ||||||
| %	When optimizations are enabled |  | ||||||
| %	(=|current_prolog_flag(optimise, true)|= a macro removes =the= |  | ||||||
| %	entirely so that it always succeeds. |  | ||||||
| :- if(current_prolog_flag(optimise,true)). |  | ||||||
| the(_,_).  % avoid "Exported procedure mavis:the/2 is not defined" |  | ||||||
| user:goal_expansion(the(_,_), true). |  | ||||||
| :- else. |  | ||||||
| the(Type, Value) :- |  | ||||||
|     freeze(Value, must_be(Type, Value)). |  | ||||||
| :- endif. |  | ||||||
		Reference in New Issue
	
	Block a user