library(compiler) f <- function(x) x g <- function(x) repeat if (x) f(return(1)) else return(2) gc <- cmpfun(g) stopifnot(identical(g(TRUE), gc(TRUE))) stopifnot(identical(g(FALSE), gc(FALSE))) h <- function(x) { repeat if (x) f(return(1)) else break; 2 } hc <- cmpfun(h) stopifnot(identical(h(TRUE), hc(TRUE))) stopifnot(identical(h(FALSE), hc(FALSE))) k <- function(x) { repeat if (x) return(1) else f(break); 2 } kc <- cmpfun(k) stopifnot(identical(k(TRUE), kc(TRUE))) stopifnot(identical(k(FALSE), kc(FALSE))) ## **** need more variations on this. ## this would give an error prior to fixing a binding cache bug f <- function(x) { for (y in x) { z <- y; g(break) } ; z } g <- function(x) x cmpfun(f)(c(1,2,3))