Difference between revisions of "Language Reference/Attributes"
SergeMukhin (talk | contribs) (→used) |
(→Insertion Points: after) |
||
Line 16: | Line 16: | ||
=== Insertion Points === | === Insertion Points === | ||
The attributes of interfaces, classes and implementations are right | The attributes of interfaces, classes and implementations are right after the scope qualifications. | ||
<vipbnf><InterfaceDeclaration> : | <vipbnf><InterfaceDeclaration> : |
Revision as of 15:33, 6 March 2013
Various definitions and declarations can be annotated with attributes. This section describes the general syntax of attributes and where they can be placed. It also describes the meaning of the specific attributes.
Syntax
Attributes : [ Attribute-comma-sep-list ]
Attribute : one of LowerCaseIdentifier LowerCaseIdentifier ( Literal-comma-sep-list )
where the literals must either be numbers or string literals.
Insertion Points
The attributes of interfaces, classes and implementations are right after the scope qualifications.
InterfaceDeclaration : interface IinterfaceName ScopeQualifications Attributes-opt Sections end interface IinterfaceName-opt
ClassDeclaration : class ClassName ConstructionType-opt ScopeQualifications Attributes-opt Sections end class ClassName-opt
ClassImplementation : implement ClassName ScopeQualifications Attributes-opt Sections end implement ClassName-opt
The attributes of constants, domains, predicates, properties and facts are at the end (i.e. right before the terminating dot).
ConstantDefinition: one of ConstantName = ConstantValue Attributes-opt ConstantName : TypeName = ConstantValue Attributes-opt
DomainDefinition: DomainName FormalTypeParameterList-opt = TypeExpression Attributes-opt
PredicateDeclaration : PredicateName : PredicateDomain LinkName-opt Attributes-opt PredicateName : PredicateDomainName LinkName-opt Attributes-opt
PropertyDeclaration : PropertyName : PropertyType FlowPattern-list-opt Attributes-opt
FactDeclaration : FactVariableDeclaration Attributes-opt FactFunctorDeclaration Attributes-opt
The attributes of formal arguments are at the end.
FormalArgument : TypeExpression ArgumentName-opt Attributes-opt
Specific Attributes
byVal
An argument is transferred directly on the stack rather than using a pointer. Valid for formal predicate arguments provided the language is stdcall, apicall or c.
predicates externalP : (point Point [byVal]) language apicall.
deprecated
The declared entity is deprecated. The string literal describes how to migrate from it. The entity still exist, but usage will cause a warning. The entity will not exist in future versions of Visual Prolog. Valid for member declarations and scopes.
predicates oldFasioned : (string Arg) [deprecated("Use newFasion instead")].
formatString
The argument is a format string for a subsequent ellipsis argument (i.e. ...). Valid for one string argument of a predicate with an ellipsis argument. The use of formatString will make the compiler check the validity of actual arguments with respect to actual format strings (where possible).
predicates writef : (string Format [formatString], ...).
in
The argument is an input argument. Valid for a formal predicate argument.
predicates pred : (string InputArg [in]).
inline
inline alters the memory layout of a struct (i.e. a single alternative functor domain with an align qualification). The corresponding field is inlined instead of being pointed to.
domains point = align 4 p(integer X, integer Y). domains rectangle = align 4 r( point UpperLeft [inline], point LowerRight [inline] ).
It is also possible to inline fixed size string and string8 fields in structs:
domains device = align 4 device( integer Id, string DeviceName [inline(32)] ).
noDefaultConstructor
Used for a class to indicate that it should not have an implicit default constructor, and can thus be used to a class that does not have any public constructors at all. Valid for an object creating class declaration.
class classWithoutPublicConstructors : myInterface [noDefaultConstructor] ... end class classWithoutPublicConstructors
out
The argument is an output argument. Valid for a formal predicate argument.
predicates pred : (string OutputArg [out]).
programPoint
Used for a predicate or constructor declaration to indicate that it recieves an extra input argument which describes the place in a program (program point) where this predicate was called. This additional argument has programPoint type which is declared in the PFC core class like:
domains programPoint = programPoint(hScopeDescriptor ClassDescriptor, string PredicateName, sourceCursor Cursor).
The clause name of such predicate or constructor should have suffix "_explicit". Valid for a predicate or constructor declaration.
predicates pred : (string String) [programPoint]. clauses pred_explicit(ProgramPoint, String) :- ...
The programPoint attribute is described in more details in the description of Predicates, and it is a vital part of the exception system, see Exception Handling.
retired
The declared entity is retired. The string literal describes how to migrate from it. The entity does not exist anymore.
predicates veryOldFasioned : (string Arg) [retired("Use newFasion instead")].
sealed
Used for an interface to indicate that it cannot be supported by any other interface. This allows to create more efficient codes, because the compiler provides some optimization when using the objects of such type. Valid for an object creating class declaration as a construction interface.
interface myInterface [sealed] ... end interface myInterface class myClass : myInterface ... end class myClass
union
Used for creating functor domains with several alternatives but no real functors. This should only be used to mimic C/C++ union structs in low-level interfacing. Valid for functor domain with several alternatives and alignment.
domains u64var = align 4 u64(unsigned64 Value64); u64_struct(unsigned Low32, unsigned High32) [union].
used
An unused local member can be marked used to prevent the compiler to issue a warning and remove the corresponding code. Valid for members.
predicates seeminglyUnused : () [used].