[racket-dev] comments on "comments on learning Racket"
I have been re-reading the notes on Artyom.me's site, taking notes. Few question his comments, some suggest reactions that should come from us, others are personal musings.
I know this is a bit of a brain dump but I find this person's thoughts worthwhile for us (devs).
Notes on "Learning Racket" by Artyom
How to get a Haskellian like Artyom to fall in love with Racket at first sight.
;; -----------------------------------------------------------------------------
** What does it mean to say ", or get guidance"?
Where should people get guidance? What about?
Avoid useless words.
** The REPL section in the Guide must open with (+ 1 1)
** tab completion must be faster
** can we force the help corner[1] to show up for "beginners"?
(the first five hours of using a raw DrRacket or you pay us 50 bucks.)
The WOW #2 should come right away.
** can we get the help corner to show up for things at the DrRacket repl?
** How can we get the help corner show anything about module-locally defined
identifiers ("defined in this module" would be a good start) or imported
identifiers ("imported from module X") and if it goes thru a contract-out,
the help corner may even say something ("with contract (-> integer? integer?)")
?? I don't get the "Uniform syntax is harder to read" comment. More
highlighting, hmph?
** do we need to get across racket/base more quickly?
(so that a hello world program executable looks smaller.)
[:~/Tmp] matthias% du helloworld
1664 helloworld
** "This chapter [1 of Guide] was small and boring. Next, please!"
We need to spice up the first chapter of
!! HAH! The Undefined value shows up in his blog, not even half way down.
** Should we provide a 'where' form?
** He wants an Arc-style lambda function. Hmph.
?? How did the kid get (apply and ...) to work? Was I asleep?
(( He doesn't know what type safety is. I understand that C++ers don't get
it. Why do Haskellians don't get it? ))
** People want overloading. (< "hello" "hello world") should work. Hmph.
** When we introduce for/list we should explain it directly, in words.
** I do get jealous when I see
[(i, j, k) | i <- [1..10], j <- [i..10], k <- [j..10], i^2 + j^2 == k^2]
vs
(for*/list ([i (range 1 20)] [j (range i 20)] [k (range j 20)] #:when (= (+ (sqr i) (sqr j)) (sqr k)))
(list i j k))
(using full width according to Racket style)
** The time-is-not-a-procedure thing is two misunderstandings in one:
-- we are in a by-value world
-- by the time were to reach the calls to factorial, it's evaluated
Show
(for ((f (list f1 f2 f3 f4)))
(time (f 10000)))
early?
** Do we need to add these to our library?
;; (X ... -> Y ...) X *-> [List-of Y]
(define (gather-return-values f . s)
(call-with-values (lambda () (apply f s)) list))
;; Nat (X ... -> Y ...) X *-> Y
(define (nth-return-value i f . s)
(call-with-values (lambda () (apply f s)) (lambda l (list-ref l i))))
** Printing is brutally expensive in DrRacket. Is there a way to make it
cheaper?
** Why does he think "Performance sucks"?
** What is this about:
"Support for functional paradigm is somewhere in the middle. Everything
needed is there, but it's not very convenient to use. (I expect to stumble
upon goodies/fp or haskell-racket module one day, but for now I won't be
looking for it – I need to understand Racket's main paradigm before
allowing myself to consciously deviate from it.)"
I am thinking of Racket as FP.
** This
"Given that reading every chapter of TRG raises lots of questions and
provokes endless tinkering with not-quite-related concepts, I'll be
happy if I manage to read as much as chapter 2.4."
means the Guide is the wrong kind of introduction for a functional
Haskellian.
** quote and friends should not show up in whatever replaces Guide for
Functionalists
;; -----------------------------------------------------------------------------
[1] What do we call the thing that shows up at the top right?
;; =============================================================================
PART II
** "I see."
Some of our error messages are, well, real-world error messages. Like all
compilers, they assume complete knowledge of the languages so when a novice
makes a mistake, he gets, well, nothing out of it.
Should we try our hands on a staged approach to learning the API for our
world of syntax and compilation? (Old people would use the word 'macro'
here.)
** "Why, why must everything be Inferior By Default?"
We obviously need a 'syntax story' that takes readers directly from
define-syntax-rule to syntax-parse, bringing in hygiene only late, when it
truly matters to raise expressiveness
Further down he writes "But, but... It's wrong to spend a day hopping around
only to write this. It's unsatisfactory. Things like this turn people into
Hulks, y'know." Boy is he correct.
We need stories.
** "There's probably some good reason for it, but I've no idea what it could be."
So do we need to explain why literals in syntax-parse must be pre-bound?
I have run into this, read up on it, said "duh", and moved on.
In general, how much rationale should be given for features? Do we need a
more hyper-linked document organization?
** "Why doesn't DrRacket indent syntax-parse correctly? This is inconvenient."
Yes. Why?
** "For some reason I was thinking that indentation information is somehow
stored with functions/macros themselves. I was wrong."
We discussed this years ago. Hmph, he thought so too.
** Packages worked really well for him. Great!
** "I'm afraid that with the level of flexibility Racket allows, I'll never get
to writing an actual program – most likely I'll be spending my time improving
Racket itself (well, or at least changing it to suit my tastes)."
Well, I went there when I was young and saw macros. Who hasn't?
** *****************************************************************************
"As a public promise (?), I want to state that in less
than a year I'll write and open-source some medium-sized project in
Racket. (And, of course, I'll be documenting the process.)"
Let's check on him then.
** *****************************************************************************