nchurch <[email protected]> writes:
> Replying to Tassilo: I'm not quite sure I understand this problem:
>
>> then changing its name requires changing all places where
>> clojure.core.quotient/remainder is used
>
> surely the call to Values takes place inside the function definition,
> which happens \once. If you want a different variable name on \use,
> you use a let; if you want to return a different variable name on
> \definition, you use a let inside the function (or perhaps Values
> could have some sugar for renaming variables).
I understand your proposal in such a way, that in a function
(defn foo [x]
(let [double-x (* 2 x)]
(values x double-x)))
the `values' was actually a macro that
1. creates a namespace for the function (user.foo)
2. creates a var holding the last second value (user.foo/double-x)
where the name of the var is dictated by the local var holding the
value
3. expands into code that sets user.foo/double-x at runtime and then
returns the first value x
Then, if I want to use the second value returned by foo in my code, I'd
so something like
(let [x (foo 17), dx user.foo/double-x]
(do-something-with x dx))
Since I have to refer to user.foo/double-x to get the second value, once
that name changes, I have to change my code, too.
But probably, I've simply misunderstood your intent.
> It's true that quotient/remainder must be thread-local (in fact it
> should really be function-local), but this makes it no different than
> a let-variable or a function parameter; it doesn't necessarily mean it
> is mutable. Is X mutable in
>
> (let [X 1
> X (inc X)])
>
> ?
Nope, the latter X shadows the former X. But there's no such thing for
vars in a namespace.
> If you slapped that X in a data structure, you would not find it
> changing under your nose. quotient/remainder really has to behave in
> the same way----imagine the quotient call creates an invisible let
> every time.
Sorry, I don't get you. What am I misinterpreting in your approach? To
me, it looks like you want to bind the multiple values to vars in an
ad-hoc namespace corresponding to a function. Then, there's no such
thing as a lexical scope provided by let. A namespace is a globally
accessible thingy.
> Perhaps I should explain why I think this is "simple". It's simple
> because a) it allows you to ignore the extra values unless you want
> them and
Well, the Common Lisp approach does so, too.
> b) it gives you ready-to-use names. To my taste, b) is very
> important.
To me, that's a major downside.
> (quotient 5 2)
> (quotient 8 3)
>
> quotient(5 2)/remainder --> 1
Huh, you want to create a namespace not only for each function but for
each function call? And then store the multiple values for each of
them?
Bye,
Tassilo
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en