I think I understand more now though, everyone.  Thanks.  clojure chose
lists for the data structure for code so lists sort of have a special place
in the language.

Thanks again.

On Fri, Oct 28, 2011 at 1:13 AM, e <evier...@gmail.com> wrote:

>
>
> On Thu, Oct 27, 2011 at 8:26 PM, Mark Rathwell <mark.rathw...@gmail.com>wrote:
>
>> > Maybe it would be clearer if I proposed some other, lesser-used chars,
>> like
>> > "%(1 2 3 4)" or even "<1 2 3 4>".  That is, I'm not so much saying,
>> "this
>> > needs to be treated as data and not eval'd" as I am simply saying, "this
>> is
>> > the 'list' data structure as opposed to some other".
>>
>> A list data structure and a list code structure are the same.
>
>
> why wasn't vector chosen for code?
>
>
>> The
>> only difference is that the programmer decides when one should not be
>> evaluated.  By creating separate syntax for a list data structure you
>> are in essence creating a different structure for lists of data than
>> lists of code, and you no longer have a straightforwardly homoiconic
>> language.
>>
> This seems like a hugely important thing for me to grock, but it is easier
> to grock in languages that, say, ONLY have lists.  Otherwise it seems like
> code is arbitrarily ONE of the data structures and, therefore is NOT
> homoiconic with respect to any other data structure.
>
>
>>
>> > Why is there an assumption that
>> > code as data means code as lists? Or is there?
>>
>> This is the key to everything.  Code is data
>
> yes, fine. but "data" doesn't always mean list in *my* mind.  But I'm
> starting to get that it was chosen to be the same thing in lisps.
>
>
>> , data is code, they are
>> the same structure.  By treating a list of data (integers for example)
>> differently than a list of code (function and args), you create a
>> situation where code and data are no longer the same thing.
>
> no. code and lists are no longer the same thing.  I see "data" as a generic
> concept . . .a superset, not a different set.  code could be "data" that I
> haven't picked a data structure for, yet.
>
>
>>  That
>> trait is a fundamental trait of lisps, and makes things like macros
>> much simpler.
>
> I suspected this, too. ok.
>
>
>
>> You don't have to call the structure a list, you can
>> call it something else if you prefer, but whatever it is called, it
>> must be the same structure that defines code and defines data.
>
> But, again, there are plenty of structures that define "data" differently
> then that which was chosen for code.  So why not just have a "code
> structure".  Again, it already seems broken with respect to other
> structures.  Here's some "data". It's a vector. Here's *more* data.  It's a
> chunk of code.  Ah but it was arbitrarily decided (more from history and
> evolution) that *that* data is a list.  Broken.
>
>
>
>>
>>
>> On Thu, Oct 27, 2011 at 6:58 PM, e <evier...@gmail.com> wrote:
>> >
>> > On Oct 26, 2011 7:15 PM, "Stuart Halloway" <stuart.hallo...@gmail.com>
>> > wrote:
>> >>>
>> >>> checking out the "Try Clojure":
>> >>>
>> >>> if you type the following, you get output that matches what you typed
>> >>> in every case except for lists.
>> >>>
>> >>> Vectors: --> [1 2 3 4]
>> >>> [1 2 3 4]
>> >>>
>> >>> Maps: --> {:foo "bar" 3 4}
>> >>> {:foo "bar" 3 4}
>> >>>
>> >>> Lists: --> '(1 2 3 4)
>> >>> (1 2 3 4)  <----- *INCONSISTENT* why not render this as '(1 2 3 4) ...
>> >>> this would make much more sense to newbies.
>> >>>
>> >>> Sets: --> #{1 2 3 4}
>> >>> #{1 2 3 4}
>> >>
>> >>
>> >> This is an interesting question. Consistency is important, but
>> consistency
>> >> with what? Your mental model for what happens at the REPL needs to keep
>> the
>> >> R, E, and P steps clearly separate.
>> >>
>> >> Working backward:  the P (Print) prints things in a way that they can
>> be
>> >> read back, where possible:
>> >>
>> >> (read-string "[1 2 3 4]")
>> >> => [1 2 3 4]
>> >>
>> >> (read-string "(1 2 3 4)")
>> >> => (1 2 3 4)
>> >>
>> >> (read-string "#{1 2 3 4}")
>> >> => #{1 2 3 4}
>> >>
>> >> (read-string "{1 2 3 4}")
>> >> =>  {1 2, 3 4}
>> >>
>> >> If the P part of the REPL put a tick in front of lists, they would not
>> >> read back correctly:
>> >>
>> >> (read-string "'(1 2 3 4)")
>> >> => (quote (1 2 3 4))            <---- INCONSISTENT
>> >>
>> >
>> > I see the problem that token " ' " is already taken to be short hand for
>> > "quote" so to be truly consistent, I might be compelled to argue that
>> > (read-string "'(1 2 3 4)") should, seeing some hypothetical "list start"
>> > multi-char token " '( " .... just like set-start is " #{ ", be: => '(1 2
>> 3
>> > 4).
>> >
>> > You'd need two single quotes: "''(1 2 3 4) to get "quote '(1 2 3 4)" ...
>> > Wheras (1 2 3 4) means "call 1 with ..."
>> >
>> > I'll have to reread the explanation about the repl phases, but maybe I'm
>> > wondering if things don't have to be quoted if lists had the syntax I
>> > describe, and requests for function invocation had a simple paren.  Then
>> you
>> > are not saying, "treat this as data, do not eval".  You are just saying,
>> > "see my single quote paren token? That's for lists".
>> >
>> > Maybe it would be clearer if I proposed some other, lesser-used chars,
>> like
>> > "%(1 2 3 4)" or even "<1 2 3 4>".  That is, I'm not so much saying,
>> "this
>> > needs to be treated as data and not eval'd" as I am simply saying, "this
>> is
>> > the 'list' data structure as opposed to some other".
>> >
>> > Now, if you ever need to read in a program and treat it like "data",
>> well,
>> > what structure would you like to put it in? A list? A vector? A string?
>> This
>> > is, indeed, where I am fuzzy on lisps, but it seems like you parse it as
>> > desired and put it where/how you like it.  Why is there an assumption
>> that
>> > code as data means code as lists? Or is there?
>> >
>> >> Now to the R (Reader) part. If, as you suggest, the tick were part of
>> the
>> >> reader syntax for lists, you could "fix" the inconsistency above:
>> >>
>> >> ;; hypothetical Clojure with '(...) list literals
>> >> (read-string "'  '(1 2 3 4)")
>> >> => (1 2 3 4)
>> >>
>> >> Finally, consider the poor E (Evaluator) in this scenario.  The
>> evaluator
>> >> must (1) evaluate lists except (2) *not* evaluate lists that are
>> protected
>> >> by quote. But now that the tick is part of the syntax you have two
>> >> challenges:
>> >>
>> >> (1) Since the tick no longer prevents evaluation, you have to spell out
>> >> the quote (and still use the tick!)
>> >>
>> >> ;; hypothetical literal list
>> >> (quote '(1 2 3))
>> >>
>> >> (2) Since the tick is required as part of list syntax, your programs
>> have
>> >> to be written with ticks everywhere like this:
>> >>
>> >> '(defn hello-world
>> >>   []
>> >>   '(println "hello")
>> >>
>> >> You have to understand R, E and P as separate steps to understand the
>> >> REPL.
>> >>
>> >> As a side note, it is worth mentioning that the REPL is composed of
>> three
>> >> simple parts, and that interactive shells that do not have this
>> factoring
>> >> are much less useful. Imagine if your language didn't separate reading
>> and
>> >> evaluating. You would need JSON or something to serialize data...
>> >>
>> >> Stu
>> >>
>> >>
>> >> Stuart Halloway
>> >> Clojure/core
>> >> http://clojure.com
>> >>
>> >> --
>> >> 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
>> >
>> > --
>> > 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
>>
>> --
>> 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
>>
>
>

-- 
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