Mike Samuel wrote:
> Is the following copacetic by that definition?
> 
>   (function (eval, s) {
>     eval(s);
>   })

Trivially no, since it isn't annotated as functional nor pure.
Also, Cajita is a subset of ES5-strict, which prohibits 'eval' from
being used as a formal parameter name:

# It is a SyntaxError if the identifier eval or arguments appears
# within a FormalParameterList of a strict mode FunctionDeclaration
# or FunctionExpression (13.1)

Let's fix these problems first:

  var f = /*...@functional*/ function (evil, s) {
    evil(s);
  };

f is now copacetic.

> If passed the arguments (freeze(eval), 'a = 0') it will modify the
> lexical environment, and I think both arguments are copacetic
> according to the frozen functions definition,

In

  f(cajita.freeze(eval), 'a = 0;');

there is a free variable reference 'eval', and the global eval is
not accessible to Cajita code. So this program is not valid Cajita.

Suppose that a hypothetical Cajita were extended with a restricted
cajita.eval function. (It would be frozen so we don't need to explicitly
freeze it.) Then cajita.eval could not be marked as copacetic. Still,

  f(cajita.eval, 'a = 0;');

would succeed up to the point where it calls cajita.eval('a = 0;')
(because f is only marked as functional, not pure, so its
cajita.eval argument is not required to be copacetic). But then it
would fail because 'a = 0;' is not a valid Cajita program (it tries to
assign to a free variable).

Even if it did not fail for that reason, cajita.eval would presumably
be modelled on ES5-strict "global eval", which cannot directly modify
its lexical environment.

OTOH,

  f(cajita.eval, 'var a = 0;');

would succeed, but is harmless.

Note that single-argument cajita.eval would have to treat its code as
being in an empty lexical environment (apart from safe globals).
There could potentially be a variant that would support evaluation
in an explicitly specified environment:

  var f2 = /*...@functional*/ function (evil, s, e) {
    evil(s, e);
  };

  var env = {a: undefined};
  f(cajita.eval, 'a = 0;', env);

but since env is not frozen (and neither cajita.eval nor f are pure),
there is no reason to expect this code to be prevented from mutating
env.a.

-- 
David-Sarah Hopwood  ⚥  http://davidsarah.livejournal.com

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to