tailr (version 0.1.0)

can_loop_transform_body: Tests if a function, provided by its name, can be transformed.

Description

This function analyses a recursive function to check if we can transform it into a loop or trampoline version with transform. Since this function needs to handle recursive functions, it needs to know the name of its input function, so this must be provided as a bare symbol.

Usage

can_loop_transform_body(fun_name, fun_body, env)

can_loop_transform_(fun)

can_loop_transform(fun)

Arguments

fun_name

Name of the recursive function.

fun_body

The user-transformed function body.

env

Environment used to look up variables used in fun_body.

fun

The function to check. Must be provided by its (bare symbol) name.

Functions

  • can_loop_transform_body: This version expects fun_body to be both tested and user-transformed.

  • can_loop_transform_: This version expects fun to be quosure.

  • can_loop_transform: This version quotes fun itself.

Examples

Run this code
# NOT RUN {
factorial <- function(n)
    if (n <= 1) 1 else n * factorial(n - 1)
factorial_acc <- function(n, acc = 1)
    if (n <= 1) acc else factorial_acc(n - 1, n * acc)

can_loop_transform(factorial)     # FALSE -- and prints a warning
can_loop_transform(factorial_acc) # TRUE

can_loop_transform_(rlang::quo(factorial))     # FALSE -- and prints a warning
can_loop_transform_(rlang::quo(factorial_acc)) # TRUE

# }

Run the code above in your browser using DataCamp Workspace