Adding Functions to Objects in Flogram
In Flogram, functions can be embedded within objects, allowing you to encapsulate behavior with data. This enables more organized and reusable code. Here’s how you can add functions to objects:
Defining Functions Inside Objects
Functions within an object are defined by simply indenting the function definition under the object declaration.
Accessing Object Variables with self
The self
keyword within the function allows you to access variables belonging to the instance of the object the function is called on. An instance of an object is a specific realization of the object, containing its own set of data.
Here’s an example:
object Rectangle:
length: FP32
width: FP32
fn area() -> (a: FP32):
return self.length * self.width
Here’s how you can use the area
function:
fn main():
r := Rectangle(length = 5, width = 2)
# r.area() calls the function area on instance r of Rectangle
draw(r.area()) # outputs 10
Mutating Variables with Functions
If a function within an object mutates (changes) variables belonging to the object, the mut
keyword must precede the fn
keyword in the function declaration:
object Counter:
mut value: I32 = 0
mut fn increment():
self.value = self.value + 1
mut
must also be used when calling a function that changes variables that belong to an object
Here’s an example using the Counter
object:
fn main():
mut c := Counter() # c.value = 0
mut c.increment() # this is equivalent to c.value = c.value + 1
draw(c.value) # outputs 1
Productivity Tip!
Avoid attaching functions to objects unless it really makes sense for the object to own that function. Using stand-alone functions that accept objects as parameters instead often leads to more maintainable code.
Example for the Code Editor
object Point2D:
mut x: FP32
mut y: FP32
fn distanceTo(other: Point2D) -> (distance: FP32):
lengthX := self.x - other.x
lengthY := self.y - other.y
squareX := lengthX * lengthX
squareY := lengthY * lengthY
sum := squareX + squareY
distance := sqrt(sum)
return distance
mut fn moveBy(dx: FP32, dy: FP32):
self.x = self.x + dx
self.y = self.y + dy
return
fn main():
p1 := Point2D(x = 1.0, y = 2.0)
p2 := Point2D(x = 4.0, y = 6.0)
draw(p1.distanceTo(p2)) # calculates the distance
p1.moveBy(3.0, 4.0) # moves p1
draw(p1.distanceTo(p2)) # calculates the new distance
Last updated on Jun 07, 2024