all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: ken <gebser@mousecar.com>
To: "Pascal J. Bourguignon" <pjb@informatimago.com>
Cc: help-gnu-emacs@gnu.org
Subject: Re: becoming a lisp developer
Date: Wed, 27 Jun 2012 11:36:01 -0400	[thread overview]
Message-ID: <4FEB2861.4040800@mousecar.com> (raw)
In-Reply-To: <87wr2uqms4.fsf_-_@kuiper.lan.informatimago.com>



On 06/26/2012 08:29 AM Pascal J. Bourguignon wrote:
> ken<gebser@mousecar.com>  writes:
>
>> People familiar with C say it's a difficult language.  But I guess
>> they never tried it.  You can pick up a book on it and if you give it
>> a little bit of time every day, you can learn enough in a week to
>> write interesting and working programs.  And it's fun.  Shell
>> programming like bash and ksh are easy and fun too.  C++ too, but to a
>> lesser degree. But elisp....  I tried repeatedly over more than ten
>> years to learn it, bought and read a couple books on it, did some
>> tutorials, of course spent a lot of time in the docs, but it wasn't
>> until just a few years ago (and with a lot of help from this list)
>> that I was able to write my first elisp program.  I started a second
>> one last year and I'm still plodding really slow through it (but not
>> often).  It takes so long to get things to work that I'm discouraged
>> from spending time on it.  Half the time I'm trying to figure out the
>> code and moan to myself that, if I could write this function in C, I
>> would have had it written in one-tenth the time... or less.  Then,
>> after I've written some working elisp code and look at, I see it's not
>> that difficult.  So how is it that it took so long to figure out?
>
> The fact is, there are big categories of languages.
>
> C and Pascal are the same.  C or C++ are almost the same (compare Homo
> Sapiens Sapiens with Homo Neandertalis).  All the common languages fall
> into the Algol category of languages; basically, when you know one, you
> know all of them: the semantics are fundamentally the same, only the
> unimportant syntax changes.
>
> But beside the Algol category, there are:
>
> - the logical programming category (Prolog, etc),
>
> - the lisp category (eg. Common Lisp, Emacs Lisp, Scheme, and a lot of
>    older lisps)
>
> - the functional programming category (Haskell, ML, Ocaml, etc).
>
> and a lot of others.
> http://en.wikipedia.org/wiki/List_of_programming_languages_by_type
>
>
> When you change of language category, the syntax may change or not, but
> importantly, it's the semantics that change.  That's where you may be
> misled and have to spend more learning time.
>
>
> For example, syntactically, adding two numbers is written:
>
>       {
>          int a=1;
>          int b=1111111112;
>          int c=1111111113;
>          a=b+c;
>       }
>
> in C, and:
>
>      (let ((a 1)
>            (b 1111111112)
>            (c 1111111113))
>        (setf a (+ b c)))
>
> in lisp.  But the syntac is irrelevant.  You can easily write a
> pre-processor to convert one into the other.
> (See for example: http://paste.lisp.org/display/25134)

Yes, the latter sort of expression, where the operand is at the 
beginning of the expression, is called reverse-polish.  There was at 
least one hand-held scientific calculator which came out in the 
mid-1970s which used this notation.  Though it took only a few seconds 
to adjust one's thinking to this syntax, that sort of syntax on such 
devices pretty much died out (AFAIA), people, not surprisingly, 
preferring a notation which conformed more closely to natural language. 
  Conforming to natural language has long been a goal of cyber-language 
developers, for understandable reasons: less attention to syntactic 
anomolies allows for more attention to logic and so too then probably 
better applications.

But, yes, just this once instance is trivial.  Back in the 1980s I wrote 
an expression parser (in C).  I remember being quite surprised how 
little code it required, just ten or twelve lines IIRC.  It was so 
pleasing in its terseness and elegance that I assigned the same task to 
my college students to exercise our discussion on recursion.  (To make 
it a homework assignment they could do in a week, their C code needn't 
perform error checking, but rather assume that all expressions their 
programs would read in were well formed, nor would they need consider 
critically heavy burdens on the stack due to very deep nesting.)  This 
function/program was intended to parse C-style syntax (e.g., "(2 + (5 * 
3))"), but it would be trivial to alter it to parse reverse-polish, or 
vice versa-- which offers up the question, why require text to be parsed 
to conform to one syntactical ruleset as opposed to another?  The code 
for the parser is nigh identical... so why not cut developers a small 
break by conforming more closely to natural language?


>
>
> What's more important to understand the meaning of those programs, is
> their semantics.
>
> In a 32-bit C, (ie. a C where int has a 32-bit two-complement
> representation), the result would be -2072745071 with some compiler.
> (In some other C compilers, it could signal a run-time error, the C
> standard doesn't specify what must happen).
>
> In a 64-bit C, (ie. a C where int has a 64-bit two-complement
> representation), the result would be 2222222225.
>
> In a 32-bit emacs, which has no bignums and where fixnums are limited to
> 29-bit two-complement the result would be 74738577.
>
> In a 64-bit emacs, which has still no bignums, but where fixnums are
> limited to 61-bit two-complement, the result would be 2222222225.
>
> In a Common Lisp implementation, which therefore has bignums, whatever
> the size of the fixnums, the results would be 2222222225.
 >
 > ....

Thank goodness such concerns are seldom central to applications 
developers, systems developers having for the most part isolated app 
developers from hardware vagaries (as von Neuman intended).  This 
however has long been an area requiring more co-operation between 
hardware and systems folks.


> The semantical differences are therefore:
>
> In Common Lisp, + for integers implements the mathematical integer
> addition (up to the available memory).
>
> In emacs lisp, + for integers implements the addition modulo 29 or 61
> depending on the machine word size.
>
> In C, + for int may implement the addition modulo 32 or 64, or something
> else (including signaling a run-time error, or a compilation-time error).

Yes, if these were the only barriers to understanding, for all practical 
purposes, there effectively be no barriers at all.



> And this is only for the simpliest of the operation.  In the code sample
> above, there are other semantic differences, like the fact that in lisp
> there are no statement, therefore all expression returns a value.  setf
> returns the last value assigned.  let returns the result of the last
> expression in its body, so the let form actually returns the result of
> the addition, and if you evaluate it in a REPL (read eval print loop),
> then this result will be printed too.  On the other hand, {} is a
> statement in C, which has no result value and nothing is ever returned
> or printed by that code sample.  The let form is a valid lisp expression
> as it is.  The {} however does not stand alone: you need to wrap it in a
> C program to make it really meaningful.  There's the fact that in C,
> types are a property of the variables, while in Lisp types are property
> of the values.  The fact that setf is actually a macro, that while it's
> provided by the language, could be written by the user if it was
> missing, like any other macros, vs. the fact that = is a hard wired C
> operator and the user can't add new operators (it's possible for some of
> them in C++, but with vastly different mechanisms and semantics than
> lisp macros).  Etc.

One thing you seem to be implying is that elisp is more consistent in 
its syntax than C in many regards.  Consistency, however, can lead to 
ambiguity.



> The conclusion is that to learn a programming language in a different
> category of what you know already, you must forget what you know, and
> just learn it from the beginning.

I wouldn't say, "forget what you know" but rather "don't make 
assumptions about one language based solely on knowledge from another 
language."  As you pointed out above, while there are many differences, 
there are also many similarities.  We don't really want to forget and 
then have to relearn the similarities.


>
> And the existance of those different broad categories is also the reason
> why you are told to learn different programming languages.  But learning
> C and C++ doesn't count.  You must pick one language in each category!

My goal in life isn't to experience every category of programming 
language.  I'd just like to contribute code to perform tasks which in my 
estimation seem to need coding... where and when I'm able to.


> Since you already know C, you should learn at least Prolog, one lisp
> (but it's also useful to learn elisp, scheme and Common Lisp),  Haskell,
> APL and Smalltalk.

Too much samsara.  :)


>> Maybe, if I live to be three hundred, I'll write an elisp book myself.
>
> Usually it comes much fater.

Thanks for the encouragement... and for the conversation.  But it will 
depend on understanding, which doesn't conform itself in any way to 
calendars.




  reply	other threads:[~2012-06-27 15:36 UTC|newest]

Thread overview: 123+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <mailman.2952.1339986753.855.help-gnu-emacs@gnu.org>
2012-06-18  3:22 ` Emacs users a dying breed? Pascal J. Bourguignon
2012-06-18  9:32   ` djc
2012-06-18 10:25     ` Pascal J. Bourguignon
2012-06-18 17:09     ` Ken Goldman
2012-06-21 15:27 ` rusi
2012-06-22  6:19   ` Tom
2012-06-22  8:45     ` Jeremiah Dodds
2012-06-22  9:40       ` Tom
2012-06-22 11:07         ` Bastien
2012-06-22 11:16           ` Andreas Röhler
2012-06-24 23:19             ` James Freer
2012-06-25  7:23               ` give emacs --daemon / emacsclient a try (was: Re: Emacs users a dying breed?) Gregor Zattler
     [not found]             ` <mailman.3407.1340581002.855.help-gnu-emacs@gnu.org>
2012-06-25  2:58               ` Emacs for writers (was " rusi
2012-06-25  9:38                 ` James Freer
2012-06-26 21:47                   ` James Freer
     [not found]                   ` <mailman.3534.1340747277.855.help-gnu-emacs@gnu.org>
2012-06-27  3:41                     ` rusi
2012-06-22 13:13           ` Emacs users a dying breed? Tom
     [not found]           ` <mailman.3233.1340370922.855.help-gnu-emacs@gnu.org>
2012-06-22 14:12             ` Jay Belanger
2012-06-22 15:02               ` Tom
     [not found]               ` <mailman.3245.1340377350.855.help-gnu-emacs@gnu.org>
2012-06-22 18:25                 ` John Bokma
2012-06-22 11:17         ` Jeremiah Dodds
2012-06-22 12:03           ` Andreas Röhler
2012-06-22 12:21             ` Richard Riley
2012-06-22 13:04               ` Jonathan Groll
2012-06-23 11:33                 ` Philipp Haselwarter
2012-06-23 12:05                   ` Teemu Likonen
2012-06-23 12:35                     ` Philipp Haselwarter
2012-06-23 12:53                       ` Eli Zaretskii
2012-06-23 13:53                       ` S Boucher
2012-06-23 12:37                     ` suvayu ali
2012-06-25 19:00                   ` Ken Goldman
2012-06-23 14:02               ` S Boucher
2012-06-22 12:46             ` Thien-Thi Nguyen
2012-06-22 13:27               ` Andreas Röhler
2012-06-22 13:45               ` Doug Lewan
2012-06-22 13:09           ` Tom
2012-07-02 11:36             ` Mihamina Rakotomandimby
2012-06-22 15:08 ` Issues with emacs (was Emacs users a dying breed?) rusi
2012-06-22 15:26   ` Issues with emacs Pascal J. Bourguignon
2012-06-23  2:28     ` rusi
2012-06-23  9:47       ` Pascal J. Bourguignon
2012-06-22 16:41   ` Issues with emacs (was Emacs users a dying breed?) Drew Adams
2012-06-22 18:01     ` Bastien
2012-06-23 20:04       ` Tom
2012-06-24 11:38         ` Eric Abrahamsen
2012-06-24 14:00           ` Drew Adams
2012-06-25 19:23           ` Ludwig, Mark
     [not found]         ` <mailman.3361.1340537904.855.help-gnu-emacs@gnu.org>
2012-06-24 13:52           ` Issues with emacs Pascal J. Bourguignon
     [not found]       ` <mailman.3330.1340481863.855.help-gnu-emacs@gnu.org>
2012-06-23 23:49         ` Dan Espen
2012-06-24  1:24           ` Pascal J. Bourguignon
2012-06-24  2:39           ` ken
2012-06-25 18:02             ` Sivaram Neelakantan
2012-06-26  3:03               ` becoming a developer [was: Re: Issues with emacs] ken
     [not found]               ` <mailman.3485.1340679833.855.help-gnu-emacs@gnu.org>
2012-06-26  3:23                 ` rusi
     [not found]                   ` <CAPyVhy_fL3KLrNzqOMbg69UqUMAKPmXbbu7gVYQcK+KiML44hA@mail.gmail.com>
     [not found]                     ` <CAJ+Teof7T6qXdztq_Pjh+S8gVXQV-ToYJ6EQrPNYQAumn_aDOA@mail.gmail.com>
2012-06-27 13:38                       ` antoine no
2012-06-27 17:44                         ` Aurélien Aptel
2012-06-26 12:29                 ` becoming a lisp developer Pascal J. Bourguignon
2012-06-27 15:36                   ` ken [this message]
2012-06-27 16:12                     ` PJ Weisberg
     [not found]                   ` <mailman.3561.1340811384.855.help-gnu-emacs@gnu.org>
2012-06-27 16:09                     ` Pascal J. Bourguignon
     [not found]             ` <mailman.3455.1340647361.855.help-gnu-emacs@gnu.org>
2012-06-25 18:40               ` Issues with emacs notbob
2012-06-25 19:05                 ` Glyn Millington
     [not found]           ` <mailman.3348.1340505598.855.help-gnu-emacs@gnu.org>
2012-06-24  6:39             ` rusi
2012-06-24  7:01               ` Corentin Henry
2012-06-24  7:55                 ` Andreas Röhler
2012-06-24 16:04                   ` Eli Zaretskii
2012-06-24 17:38                     ` Andreas Röhler
2012-06-24 18:21                       ` Eli Zaretskii
     [not found]                 ` <mailman.3355.1340524541.855.help-gnu-emacs@gnu.org>
2012-06-24 12:17                   ` notbob
2012-06-24 13:24                     ` Deniz Dogan
2012-06-24 14:42                       ` Yuri Khan
2012-06-24 15:08                       ` Gregory Benjamin
2012-06-25 19:26                         ` Deniz Dogan
2012-06-24 16:24                       ` Eli Zaretskii
2012-06-25 19:25                         ` Deniz Dogan
2012-06-24 13:36                     ` Richard Riley
     [not found]                     ` <mailman.3362.1340544276.855.help-gnu-emacs@gnu.org>
2012-06-24 14:03                       ` notbob
2012-06-24 16:01                 ` Eli Zaretskii
2012-06-24 10:14               ` Rainer M Krug
2012-06-24 14:18                 ` Drew Adams
2012-06-24 15:41                   ` Rainer M Krug
2012-06-24 16:07                     ` Drew Adams
2012-06-24 16:48                       ` Rainer M Krug
     [not found]               ` <mailman.3354.1340521292.855.help-gnu-emacs@gnu.org>
2012-06-24 12:15                 ` notbob
2012-06-24 14:02               ` Drew Adams
2012-06-25  3:54               ` ken
     [not found]               ` <mailman.3424.1340596458.855.help-gnu-emacs@gnu.org>
2012-06-25  5:51                 ` rusi
2012-06-25  7:45                   ` Helmut Eller
2012-06-25  8:57                     ` Tom
2012-06-25 21:24                       ` Jeremiah Dodds
2012-06-26  5:50                         ` Tom
2012-06-26 20:08                           ` Jeremiah Dodds
     [not found]                         ` <mailman.3486.1340689846.855.help-gnu-emacs@gnu.org>
2012-06-26 13:29                           ` notbob
2012-06-26 17:47                             ` Dustin Hemmerling
2012-06-26 18:13                             ` Sivaram Neelakantan
2012-06-26 18:32                             ` Richard Riley
2012-06-28 12:14                               ` Tom
     [not found]                             ` <mailman.3520.1340735564.855.help-gnu-emacs@gnu.org>
2012-06-26 19:28                               ` notbob
2012-06-26 19:49                                 ` Ludwig, Mark
2012-06-26 19:52                                   ` Pascal J. Bourguignon
2012-06-27 15:49                                   ` PJ Weisberg
2012-06-28  2:09                                     ` John Wiegley
     [not found]                                 ` <mailman.3523.1340740164.855.help-gnu-emacs@gnu.org>
2012-06-26 20:13                                   ` notbob
2012-06-26 23:57                             ` John Wiegley
2012-06-27  9:23                               ` temacs Jambunathan K
2012-06-27 14:44                                 ` temacs Ken Goldman
2012-06-28  2:40                                   ` temacs John Wiegley
2012-06-28  8:49                                     ` temacs Bastien
2012-06-29 19:37                                       ` temacs Ken Goldman
     [not found]                                       ` <mailman.3732.1340998682.855.help-gnu-emacs@gnu.org>
2012-06-30  3:51                                         ` temacs rusi
2012-06-27 14:44                                 ` temacs suvayu ali
2012-06-27 16:24                                   ` temacs Alp Aker
2012-06-27 19:57                                     ` temacs Ken Goldman
2012-07-05  4:14                                 ` temacs John Wiegley
2012-07-05 12:46                                   ` temacs Eli Zaretskii
2012-07-07 16:51                                     ` temacs John Wiegley
2012-07-07 17:20                                       ` temacs Eli Zaretskii
2012-06-27 15:48                             ` Issues with emacs Stefan Monnier
2012-06-26  3:08                     ` rusi
2012-06-26  8:35                       ` Thien-Thi Nguyen
2012-06-27  5:54                   ` MBR
2012-06-26 18:03             ` Bug Dout
2012-06-25  2:43       ` Issues with emacs (was Emacs users a dying breed?) Ugly Sean

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4FEB2861.4040800@mousecar.com \
    --to=gebser@mousecar.com \
    --cc=help-gnu-emacs@gnu.org \
    --cc=pjb@informatimago.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.