Last active
June 6, 2022 14:13
-
-
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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%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