Arc Forumnew | comments | leaders | submitlogin
2 points by rocketnia 5304 days ago | link | parent

How about replacing "w/uniq eof" with "let eof []"?


2 points by aw 5304 days ago | link

Maybe not [], that relies on the language not ever getting serializable functions.

-----

1 point by rocketnia 5304 days ago | link

Agreed.

-----

1 point by akkartik 5304 days ago | link

I don't follow this exchange. Why would let eof [] work? And what do serializable functions have to do with it?

-----

5 points by aw 5304 days ago | link

We could use any unique value that compares equal to itself with "is" but isn't the same (by "is") as any possible value read from the input file.

An example of such a value is "(list 'a)". This creates a new pair (cons cell), which "is" itself, but "isnt" any other pair or value.

Another example is in Arc 3.1, fn returns a new #<procedure> which "is" itself but not any other function or other value.

"[]" expands into such a function, so it's a cute way of getting a unique value. However, for web applications it would be nice if closures could be serialized (written out to a file and read back in later), so that a server could be restarted without losing user's state.

If this were possible, then "[]", which expands into "(fn (_) nil)", could be written out to a file and read back in later.

Even if we could read in serialized functions, using [] as a sentinel value would still work if every evaluation of (fn ...) continues to produce a new, unique function, much like how "(list 'a)" or "(cons t t)" produces a new, unique pair every time.

Or maybe it would be useful for optimization or for some other reason for two identical functions "(fn (_) nil)" to evaluate to the same function object, much like how every time we read in a symbol 'x it evaluates to the same symbol. Or not... that might be a useless optimization (at least, I can't think of a use for it off the top of my head). But that was my thinking behind "maybe not []".

-----

3 points by waterhouse 5303 days ago | link

Incidentally, app.arc creates a unique "fail" global variable in this way. (Eeeeeaaaaaargh, never use asterisks in text. The word "fail" has an asterisk at the end. Is there a way to escape asterisks?)

  ; (= fail* (uniq))
  
  (def fail* ()) ; coudn't possibly come back from a form

-----

3 points by rocketnia 5303 days ago | link

You've even italicized the reply button. :-p I think the only way to "escape" an asterisk is to put whitespace after it: If you put a space at the end of "fail* ", presto. You could also subtly tweak your style in order to write fail* without quotation marks or other punctuation afterward. But yeah, escaping would be nice.

-----