I apologize about the beginner questions. I am new to Clojure. 

If I do this: 

(defn run-server [port what-to-do]
  (let [server-socket (ServerSocket. port "localhost")]
    (while (not (. server-socket isClosed))
      (listen-and-respond server-socket what-to-do))))

(defn -main [& args]
  (let [port (Integer/parseInt (first args))
        service (symbol (second args))]
    (println "Server is starting")
    (println "port: " port)
    (println  (second args))
    (println  (symbol (second args)))
    (println "service: " service)
    (run-server port service)))

And on the command line I call it like: 

 java -jar who-is-logged-in-1.0-standalone.jar 3456 "who-is-here-now"

This prints out:

Server is starting
port:  3456
who-is-here-now
who-is-here-now
service:  who-is-here-now

but then I get this error: 

Exception in thread "main" java.lang.ClassCastException: java.lang.String 
cannot be cast to java.lang.Number
at who_is_logged_in.core$run_server.invoke(core.clj:27)

Line 27 is: 

(defn run-server [port what-to-do]

The only way I can read the error message is to think that the code is 
trying to assign the value of what-to-do to the (integer) "port". 

What have I done wrong? 




On Tuesday, August 28, 2012 12:47:44 PM UTC-4, larry google groups wrote:
>
> >Command line arguments that are not strings need to be converted 
> > prior to use by your main function.  
>
> That makes sense, I need to cast it to a symbol, yes? I have a problem 
> with that though. At the REPL I tried something like this: 
>
> (def hey (resolve (symbol what-to-do)))
>
> which worked great at the REPL, but in my code I get "nil" returned from 
> resolve. If I do this: 
>
> (defn -main [& args]
>   (let [port (Integer/parseInt (first args))
>         service (resolve (symbol (second args)))]
>     (println "Server is starting")
>     (println "port: " port)
>     (println  (second args))
>     (println  (symbol (second args)))
>     (println "service: " service)
>     (run-server port service)))
>
> And call it like this:
>
> java -jar who-is-logged-in-1.0.0-SNAPSHOT-standalone.jar 3456 
> "who-is-here-now"
>
> Everything looks correct till the final line when I get "nil": 
>
> Server is starting
> port:  3456
> who-is-here-now
> who-is-here-now
> service:  nil
>
>
>
>
>
>
>
>
> On Tuesday, August 28, 2012 6:53:24 AM UTC-4, Jon_Boone wrote:
>>
>> Command line arguments that are not strings need to be converted prior to 
>> use by your main function.  
>>
>> Look at the code for the port number and do the same for the service. 
>>
>> --jon
>>
>>
>> On Aug 28, 2012, at 2:42, larry google groups <lawrenc...@gmail.com> 
>> wrote:
>>
>>
>> So, this started when I read Keith Swallow's article on a simple web 
>> server:
>>
>> http://keithcelt.com/a-simple-web-server-in-clojure
>>
>> I took his code and ran "lein new" to create a new project and I copy and 
>> pasted his code to core.clj and made some minor adjustments, adding 
>> gen-class and main so I could run this from the command line. My main 
>> function looked like this: 
>>
>> (defn -main [& args]
>>   (let [port (Integer/parseInt (first args))]
>>     (println "Server is starting")
>>     (run-server port echo)))
>>
>> Which called his function: 
>>
>> (defn run-server [port service]
>>   (let [server-socket (create-socket port)]
>>     (while (not (. server-socket isClosed)) 
>>
>>       (listen-and-respond server-socket service)))) 
>>
>> I compiled that and ran "lein uberjar" and then ran it from the command 
>> line and it worked great. 
>>
>> Then, to make it slightly more flexible, I wanted to hand in the name of 
>> the service from the command line. So I made a minor change: 
>>
>>
>> (defn run-server [port what-to-do]
>>   (let [server-socket (ServerSocket. "localhost" port)]
>>     (while (not (. server-socket isClosed))
>>       (listen-and-respond server-socket what-to-do))))
>>
>> (defn -main [& args]
>>   (let [port (Integer/parseInt (first args))
>>         service (second args)]
>>     (println "Server is starting")
>>     (println "port: " port)
>>     (println "service: " service)
>>     (run-server port service)))
>>
>> I compiled this and ran it. And now this line: 
>>
>> (defn run-server [port what-to-do]
>>
>> Gets this error: 
>>
>> Exception in thread "main" java.lang.ClassCastException: java.lang.String 
>> cannot be cast to java.lang.Number
>> at who_is_logged_in.core$run_server.invoke(core.clj:27)
>>
>> I'm calling it from the command line with: 
>>
>> java -jar who-is-logged-in-1.0.0-SNAPSHOT-standalone.jar 3456 
>> who-is-here-now
>>
>> I also tried putting the service name in quotes: 
>>
>> java -jar who-is-logged-in-1.0.0-SNAPSHOT-standalone.jar 3456 
>> "who-is-here-now"
>>
>> Can anyone tell me what is wrong? Why does Clojure think I'm trying to 
>> cast "who-is-here-now" to a number? 
>>
>>
>>
>>  -- 
>> You received this message because you are subscribed to the Google
>> Groups "Clojure" group.
>> To post to this group, send email to clo...@googlegroups.com
>> Note that posts from new members are moderated - please be patient with 
>> your first post.
>> To unsubscribe from this group, send email to
>> clojure+u...@googlegroups.com
>> For more options, visit this group at
>> http://groups.google.com/group/clojure?hl=en
>>
>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to