The answer lies in the term "REPL". You start by reading the string, you
can use `clojure.core/read-string` for this case. This will convert your
string into Clojure data:

"(+ 1 (* 2 2))" => (+ 1 (* 2 2))

That's the "R" part of "REPL", read.

Next step is "E" for "eval". We need to evaluate the structure. In a very
simple sort of way you can write eval thusly:

(defn simple-eval [form]
  (cond
    (integer? form) form

    (symbol? form)  (condp = form
                                 '+ +
                                 '* *)

    (seq? form) (let [[f & args] (map simple-eval form)
                         (apply f args))))

As you see this algorithm is recursive. And it's also a (very) simple lisp
interpreter. If we get an integer we return it. If we get a symbol we
return the matching function. If we get a seq, we recursively eval all the
contents of the seq then call the first resolved item passing it the args.
You could easily insert println expressions in the above code to see how it
step-by-step evals the code from left-to-right and from
deepest-to-shallowest expression.

This is known as an interpreter as it interprets the code more or less at
runtime. Now this sort of interpreter isn't exactly fast (although it's
very simple and easy to understand). So often language designers will
compile languages by preprocessing and transforming the input code into a
different language. C compiles to assembly. ClojureScript compiles to
JavaScript. And Clojure compiles to JVM byte code. The point of these
compilation steps is to remove the overhead of this interpreter.

The P in REPL stands for "Print". After we eval a form we print the result.

And then we "L"oop back to the start.

Hopefully this helps a bit.

Timothy


On Thu, Jul 20, 2017 at 4:39 PM, Lincoln Bergeson <[email protected]
> wrote:

> Here's my how-to question for someone with in-depth knowledge of the
> clojure/clojurescript compiler:
>
> If I have a string representing a valid Clojure form, say for example, "(+
> 1 (* 2 (/ 6 3)))", how would I "reduce" this form to the form with one
> s-expr evaluated? That is, how would I obtain "(+ 1 (* 2 2))"? And then
> from there, how would I obtain "(+ 1 4)", and then "5"?
>
> I read through David Nolen's brief intro to the cljs compiler:
> https://github.com/swannodette/hello-cljsc  and suspect the answer lies
> in ASTs. I'm just not sure where to start.
>
> Forgive me if I should be posting this somewhere else, just not sure where
> else I can find an answer.
>
> --
> 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
> ---
> You received this message because you are subscribed to the Google Groups
> "Clojure" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>



-- 
“One of the main causes of the fall of the Roman Empire was that–lacking
zero–they had no way to indicate successful termination of their C
programs.”
(Robert Firth)

-- 
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
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to