fact(0) -> 1 fact(N) -> N * fact(N - 1)
f_context -> fact(0) -> 1 fact(N) -> N * fact(N - 1)
examples = f_context -> f_range(I) -> f_range(I, 0, []) f_range(I, I, Accum) -> Accum f_range(I, Iterator, Accum) -> f_range(I, Iterator + 1, [Accum..., Iterator]) examples.f_range(10) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
f_context -> module("examples") f_range(I) -> f_range(I, 0, []) f_range(I, I, Accum) -> Accum f_range(I, Iterator, Accum) -> f_range(I, Iterator + 1, [Accum..., Iterator]) examples.f_range(10) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
matching_example_1("foo") -> "foo matches" matching_example_1("bar") -> "bar matches" matching_example_1(1) -> "1 matches" matching_example_1(true) -> "true matches" matching_example_1(Str) -> "nothing matches, argument: #{Str}"
matching_example_1("foo") #returns "foo matches" matching_example_1("bar") #returns "bar matches" matching_example_1(1) #returns "1 matches" matching_example_1(true) #returns "true matches" matching_example_1("baz") #returns "nothing matches, argument: baz"
test_destruct_1([Head, Tail...]) -> {Head, Tail} test_destruct_1_1([Head, Head1, Tail...]) -> {Head, Head1, Tail}
test_destruct_2([Head..., Last]) -> {Head, Last} test_destruct_2_1([Head..., Last, Last1]) -> {Head, Last, Last1}
test_destruct_3([Head, Middle..., Last]) -> {Head, Middle, Last} test_destruct_3_1([Head, Head2, Middle..., Last, Last2]) -> {Head, Head2, Middle, Last, Last2}
test_destruct_1([1,2,3]) #returns {Head: 1, Tail: [2,3]} test_destruct_1_1([1,2,3,4]) #returns {Head: 1, Head1: 2, Tail: [3,4]} test_destruct_2([1,2,3]) #returns {Head: [1,2], Last: 3} test_destruct_2_1([1,2,3,4]) #returns {Head: [1,2], Last: 3, Last1: 4} test_destruct_3([1,2,3,4]) #returns {Head: 1, Middle: [2,3], Last: 4} test_destruct_3_1([1,2,3,4,5,6]) #returns {Head: 1, Head2: 2, Middle: [3,4], Last: 5, Last2: 6}
# fibonacci_range(Count) -> fibonacci_range(Count, 0, []) fibonacci_range(Count, Count, Accum) -> Accum fibonacci_range(Count, 0, Accum) -> fibonacci_range(Count, 1, [Accum..., 0]) fibonacci_range(Count, 1, Accum) -> fibonacci_range(Count, 2, [Accum..., 1]) fibonacci_range(Count, Iterator, [AccumHead..., A, B]) -> fibonacci_range(Count, Iterator + 1, [AccumHead..., A, B, A + B])
# fibonacci_range(Count) -> fibonacci_range(Count, 0, []) fibonacci_range(Count, Count, Accum) -> Accum fibonacci_range(Count, Iterator, Accum) where(Iterator is 0 or Iterator is 1) -> fibonacci_range(Count, Iterator + 1, [Accum..., Iterator]) fibonacci_range(Count, Iterator, [AccumHead..., A, B]) -> fibonacci_range(Count, Iterator + 1, [AccumHead..., A, B, A + B])
f_all([Head, List...], F) -> f_all(List, F, F(Head)) f_all(_, _, false) -> false f_all([], _, _) -> true f_all([Head, List...], F, Memo) -> f_all(List, F, F(Head))
f_range(I) -> f_range(I, 0, []) f_range(I, I, Accum) -> Accum f_range(I, Iterator, Accum) -> f_range(I, Iterator + 1, [Accum..., Iterator])
f_context -> f_reduce(List, F) -> f_reduce(List, F, 0) f_reduce([], _, Memo) -> Memo f_reduce([X, List...], F, Memo) -> f_reduce(List, F, F(X, Memo))
f_context -> f_qsort([]) -> [] f_qsort([Pivot, Rest...]) -> [ f_qsort((X for X in Rest when X < Pivot))..., Pivot, f_qsort((Y for Y in Rest when Y >= Pivot))... ]
fact(0) -> 1 fact(N) -> N * fact(N - 1)
count(List) -> count(List, 0) count([], Iterator) -> Iterator count([Head, List...], Iterator) -> count(List, Iterator + 1)
fact(0) -> 1 fact(N) -> N * fact(N - 1)
fact(0)(function() { return 1; }); fact(N)(function() { return N * fact(N - 1); });
function_wrapper -> fact(0) -> 1 fact(N) -> N * fact(N - 1)
function_wrapper(function() { fact(0)(function() { return 1; }); fact(N)(function() { return N * fact(N - 1); }); });
var function_wrapper = function(fn){ var fn_body = fn.toString().replace(/function.*\{([\s\S]+)\}$/ig, "$1"); var new_function = Function.apply(null, fn_body, /* */ 'fact', 'N'); var fact_stub = function(){ return function(){}; }; // N var N_stub = function(){}; N_stub.type = "variable"; N_stub.name = "N"; new_function(fact_stub, N_stub) }
var f_fact_local_0 = function(){ return 1; }; var f_fact_local_1 = function(N){ return N * f_fact(N - 1); }; var f_fact = function(){ if(arguments[0] === 0){ return f_fact_local_0(); } return f_fact_local_1(arguments[0]); }; return { f_fact: f_fact };
Source: https://habr.com/ru/post/245239/
All Articles