Good workaround! Thank you sincerely.
在 2019年11月8日星期五 UTC+8上午3:23:36,Zane Shelby写道:
>
> The short answer is that ClojureScript is compiled to JavaScript before
> being evaluated, and JavaScript is very permissive when it comes to the
> number of arguments provided to functions.
>
> To show you there's no black magic going on here it helps to look at the
> JavaScript the compiler produces for your program. (One easy way to do that
> is to paste it into app.klipse.tech.) Here's what I get for your program:
>
> cljs.user.call_fn = (function cljs$user$call_fn(f){
> return f.call(null,(23),(34));
> });
> cljs.user.my_fn = (function cljs$user$my_fn(a){
> return cljs.core.println.call(null,a);
> });cljs.user.call_fn.call(null,cljs.user.my_fn);
>
> my-fn only accepts one argument, but is called (via
> Function.prototype.call
> <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call>)
>
> with two. It turns out JavaScript functions, whether called directly, via
> Function.prototype.call
> <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call>,
>
> or via Function.prototype.apply
> <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply>
> ignore
> extra arguments. The fact that you've passed it into call-fn as an argument
> before calling it is red herring, turns out.
>
> You can validate this for yourself in your browser's JavaScript console:
>
> (function(x) { return x + 1; })(0,7)
> ⇒ 1
>
> (function(x) { return x + 1; }).call(null, 0, 7)
> ⇒ 1
>
> (function(x) { return x + 1; }).apply(null, [0, 7])
> ⇒ 1
>
> JavaScript functions are also permissive in the other direction; missing
> arguments will be replaced with undefined:
>
> (function(x) { return console.log(x); })()
> undefined
> ⇒ undefined
>
> (function(x) { return console.log(x); }).call(null)
> undefined
> ⇒ undefined
>
> (function(x) { return console.log(x); }).apply(null, [])
> undefined
> ⇒ undefined
>
> Hope that helps!
>
>
> On Thu, Nov 07, 2019 at 1:46 PM, Alan Moore <[email protected]
> <javascript:>> wrote:
>
>> At the risk of being redundant, the Clojure version throws an exception:
>>
>> user=> (call-fn my-fn)
>>
>> ArityException Wrong number of args (2) passed to: user/my-fn
>> clojure.lang.AFn.throwArity (AFn.java:429 <http://afn.java:429/>)
>>
>> Alan
>>
>>
>> On Wednesday, November 6, 2019 at 9:55:47 PM UTC-8, Aklscc wrote:
>>>
>>> Hello, everyone. I use ClojureScript as following:
>>>
>>> (defn call-fn
>>> [f]
>>> (f 23 34))
>>>
>>> (defn my-fn
>>> [a]
>>> (println a))
>>>
>>> (call-fn my-fn)
>>> ;; => 23
>>>
>>> Without any exception throwed. Why does this? Is it a bug?
>>>
>>> --
>> Note that posts from new members are moderated - please be patient with
>> your first post.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "ClojureScript" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected] <javascript:>.
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/clojurescript/0c02f6ea-3b20-4356-9320-98594faf7986%40googlegroups.com
>>
>> <https://groups.google.com/d/msgid/clojurescript/0c02f6ea-3b20-4356-9320-98594faf7986%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>
>
--
Note that posts from new members are moderated - please be patient with your
first post.
---
You received this message because you are subscribed to the Google Groups
"ClojureScript" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/clojurescript/3f77e1d4-969c-40cb-aeed-06cb67738d0b%40googlegroups.com.