Reference: expressions¶
This page gives reference information for DAML expressions that are not updates:
Definitions¶
Use assignement to bind values or functions at the top level of a DAML file or in a contract template body.
Values¶
For example:
pi = 3.1415926535
The fact that pi has type Decimal is inferred from the value. To explicitly annotate the type, mention it after a colon following the variable name:
pi : Decimal = 3.1415926535
Functions¶
You can define functions. Here’s an example: a function for computing the surface area of a tube:
tubeSurfaceArea : Decimal -> Decimal -> Decimal
tubeSurfaceArea r h =
2.0 * pi * r * h
Here you see:
the name of the function
the function’s type signature
Decimal -> Decimal -> DecimalThis means it takes two Decimals and returns another Decimal.
the definition
= 2.0 * pi * r * h(which uses the previously definedpi)
Arithmetic operators¶
| Operator | Works for |
|---|---|
+ |
Int, Decimal, RelTime |
- |
Int, Decimal, RelTime |
* |
Int, Decimal |
/ (integer division) |
Int |
% (integer remainder operation) |
Int |
^ (integer exponentiation) |
Int |
The result of the modulo operation has the same sign as the dividend:
7 / 3and(-7) / (-3)evaluate to2(-7) / 3and7 / (-3)evaluate to-27 % 3and7 % (-3)evaluate to1(-7) % 3and(-7) % (-3)evaluate to-1
To write infix expressions in prefix form, wrap the operators in parentheses. For example, (+) 1 2 is another way of writing 1 + 2.
Comparison operators¶
| Operator | Works for |
|---|---|
<, <=, >, >= |
Bool, Text, Int, Decimal, Party, Time |
==, /= |
Bool, Text, Int, Decimal, Party, Time, and identifiers of contract instances stemming from the same contract template |
Logical operators¶
The logical operators in DAML are:
notfor negation, e.g.,not True == False&&for conjunction, wherea && b == and a b||for disjunction, wherea || b == or a b
for Bool variables a and b.
If-then-else¶
You can use conditional if-then-else expressions, for example:
if owner == scroogeMcDuck then "sell" else "buy"
Let¶
To bind values or functions to be in scope beneath the expression, use the block keyword let:
doubled =
-- let binds values or functions to be in scope beneath the expression
let
double (x : Int) = 2 * x
up = 5
in double up
You can use let inside do and scenario blocks:
blah = scenario
do
let
x = 1
y = 2
-- x and y are in scope for all subsequent expressions of the do block,
-- so can be used in expression1 and expression2.
expression1
expression2
Lastly, a template may contain a single let block.
template Iou
with
issuer : Party
owner : Party
where
signatory issuer
let updateOwner o = create this with owner = o
updateAmount a = create this with owner = a
-- Expressions bound in a template let block can be referenced
-- from any and all of the signatory, consuming, ensure and
-- agreement expressions and from within any choice do blocks.
controller owner can
Transfer : ContractId Iou
with newOwner : Party
do
updateOwner newOwner