Skip to content

Instantly share code, notes, and snippets.

@Th0rgal
Last active June 6, 2022 14:13
Show Gist options
  • Save Th0rgal/4589bfcb4a97de35386193a3cd26acac to your computer and use it in GitHub Desktop.
Save Th0rgal/4589bfcb4a97de35386193a3cd26acac to your computer and use it in GitHub Desktop.
Trying functional programming in cairo. Thanks https://github.com/onlydustxyz/cairo-streams for the inspiration
%builtins output range_check
from starkware.cairo.common.registers import get_label_location
from starkware.cairo.common.serialize import serialize_word
from starkware.cairo.common.alloc import alloc
func main{output_ptr : felt*, range_check_ptr}():
alloc_locals
let (arr : felt*) = alloc()
assert arr[0] = 1
assert arr[1] = 2
assert arr[2] = 3
assert arr[3] = 4
let (resp) = fold_left(sum, 0, 4, arr)
serialize_word(resp)
return ()
end
func sum{range_check_ptr}(acc : felt, value : felt) -> (output : felt):
return (acc + value)
end
func fold_left{range_check_ptr}(
function : codeoffset, acc : felt, args_len : felt, args : felt*
) -> (acc : felt):
let (func_pc) = get_label_location(function)
return _fold_left(func_pc, acc, args_len, args)
end
func _fold_left{range_check_ptr}(func_pc : felt, acc : felt, args_len : felt, args : felt*) -> (
acc : felt
):
if args_len == 0:
return (acc)
end
[ap] = [args]; ap++
[ap] = acc; ap++
call abs func_pc
return _fold_left(func_pc, [ap - 1], args_len - 1, args + 1)
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment