Annotations
Annotations in k# are used to influence the compiler and optimizer.
If the goal is produce code, refers to macros.
Annotations go before the element who is going to be marked, using @annotationName
@sideEffect
log x = println x
Annotations
sideEffect or impure
Functions marked with this annotation has side effects, so calling this function is not guarantied return the same result
@sideEffect
log x = println x
@impure
random = rand
If a function a use a impure function b then a is impure.
The @impure annotation is always calculated, this annotation is for documentation purposes, compiler always ignore the annotation.
pure
Functions marked with this annotation has not side effects, so calling this function is guarantied return the same result
@pure
native sum a b
The @pure only applies for native functions. uses in other functions are ignored by the compiler
constant
Functions marked with this annotation are considered constant values
@constant
native pi
The @constant only applies for native functions. uses in other functions are ignored by the compiler
name
Used to define the name of the function, depending the target language
@name("round-value", for=["clojure"])
@name("RoundValue", for=["c#", "f#"])
roundValue value decimals = ...
Compiler support different rules for function names depending the language.
doc
Used to define documentation over types and functions
@doc("sum two numbers **using** ...")
specialSum a b = ...
Documentation supports markdown syntax
if
Instruct the compiler the function should compile only for target language
@if(["java", "c#"])
fn = ... //if target language is java or c# compiler compiles this function
Annotation value types supported
The annotation values can be of the following types:
- String
- Number
- Boolean: true, false
- Annotation
- List of String, Number or Annotations
All values inside annotation should have a label, the first value could not have a label, in this case the label is default
@if(default=["java"])
// the same as
@if(["java"])
If an annotation has the same label for a value, the las define value is used.
@if("java", "c#")
// is the same as
@if("c#")