Is there a way to have variables only local to one function without using a let expression? In scheme, for instance, all variables defined in a lambda are not accessible from outside of it. It seems only function arguments act this way in arc.
Yes and no. (= x 1) defines or changes the global value x (well, except if x was bound to a local variable, either in a let or as a formal parameter in a function). However, behind the scene, this :
(def myfn (n)
(let m (+ n 2)
(+ m 2)))
is transformed as :
(def myfn (n)
((fn (m) (+ m 2)) (+ n 2))
So, yes, by using "pure" lambda-calculus, by applying an anonymous function to the values defined by let, you can go without it.
That's the general answer. But why do you want to avoid let ?