Paul Rubin wrote:
> If understanding Forth doesn't involve understanding the underlying
> tools, then as a "mere user" why pick something as messy as assembler,
> instead of something like Ruby?
Honestly, the semantic gap between Ruby and Forth is significantly larger
than between assembler and Forth. So if you write a Forth in Ruby, you
either make it simple, and then you will get something considerably
different (RPL or so), or you try hard to implement Forth, and it will look
messy.
>> CODE performs quite a bit of magic, in particular building dictionary
>> entries, that is explicit in assmbly language. For modification
>> automagics is better, for first understanding explicit is better.
>
> It's possible that you're referring to something I don't understand. I
> had thought CODE is basically like : (colon), i.e. it does a CREATE then
> flips a state variable to assemble code until something like ENDCODE is
> seen, but the created dictionary entry maybe has some bits set to
> indicate that it's a code word, and also CODE may switch in an
> assembler-specific word list. Is there more than that?
No, but you ditched the dictionary entry entirely, by saying that "it does a
CREATE". Then the magic Anton mentions just goes to CREATE.
>> I don't think the mathematical concepts they learn in school are much
>> help in learning to program.
>
> You mean like functions? Of course that seems useful.
Maybe if you program in Haskell. Functions are not that common in programs,
as most subroutine have side-effects. The idea of programming languages
like Haskell is to put a lot of effort into a programming language so that
you just can stay in your mathematical mind, and program a computer that
way.
>> Indeed we had Knuth here a few weeks ago, and he said that when he has
>> his mathematicians hat on he is using a different kind of thinking
>> than when he has his programmer's hat on.
>
> Sure, the stuff that mathematicians think about is different. Though,
> maybe Knuth should try programming in Haskell ;-).
If someone implements TeX in Haskell, maybe. But as long as not, there's no
proof that you can do something useful in Haskell ;-).
A friend of mine tried learning Haskell, and his "proof of the pudding" is
writing a word count program. After he was 1/3 through the Haskell book, he
still couldn't. Because the I/O was still missing, and Haskell's file I/O
isn't done right.
IMHO, Haskell should treat the file system as a index -> value table. The
index is the file name, and the value is the file data (a string). That
sort of thinking fits with the way Haskell works, and with that thinking,
the wordcount program would actually be a trivial exercise - just as it is
with Forth.
> I think of addresses as a relatively advanced concept in programming
> these days. One can be a productive Ruby programmer without knowing
> what an address is.
Which explains why WJ asks us so many questions about "can this or that be
done in Forth". It's all trivial stuff, but you need to understand what an
address is to implement it.
IMHO, this lack of addresses in modern popular languages is to avoid the
thing you don't understand. When I've read K&R, I didn't quite understand
what a pointer is. Then I read Brodie, and it was very obvious what an
address is. Going back to K&R, I now understood, what a pointer is. It's a
bit more complicated, since pointer arithmetics knows the size of the
elemens the pointer points to, while addresses don't - they are just bytes.
Haha...
> JonesForth or any Forth seems like a terrible introduction to
> programming language implementation, since Forth is relatively exotic
> language. As a language nerd it interests me -because- of that
> exoticness, but it's like learning about plant metabolism by studying
> the Venus fly trap. It's surely interesting, but one shouldn't think
> that type of plant is typical.
It was about *implementation*, not about the language as such. Forth's
implementation is no way untypical, a lot of languages have VMs which, under
the hood, don't look that much different.
> I came across an interesting term "wholemeal programming" recently.
>
http://www.cis.upenn.edu/~cis194/lectures/2012-01-12.html quotes
> Ralf Hinze who attributes the term to Geraint Jones:
>
> Wholemeal programming means to think big: work with an entire list,
> rather than a sequence of elements; develop a solution space, rather
> than an individual solution; imagine a graph, rather than a single
> path. The wholemeal approach often offers new insights or provides
> new perspectives on a given problem. It is nicely complemented by
> the idea of projective programming: first solve a more general
> problem, then extract the interesting bits and pieces by
> transforming the general program into more specialised ones.
>
> That's a Scheme-like approach but sort of the opposite of the Forth
> approach.
Oh, yes, Forth is about solving the problem at hand, not something general.
How would that wholemeal approach e.g. solve the Triceps playing Go stuff?
Task: you have a board with white and black stones. Write a program that
uses the webcam to know what's on the Go board.
Forth approach: Take the OpenGL texture the webcam renders its preview into,
and draw it with perspectivic correction so that it becomes a nice
horizontal and vertical matrix. Read in the pixels. Bin the pixels into
three classes: black, white, board (in our case, the board is green, but it
could be brown, as well). Define areas of interest (rectangles) in that
matrix. Do a majority decision on those pixels there, whatever is most is
the most likely thing there.
This sort of image recognition works only for exactly one thing: a game
board. It was quickly done, it's not 400 lines (including the interface to
the Go program and the robot). It's not perfect, because if you change the
color of the board, you have to adjust the board recognition code. If you
change the positon of the board, you have to adjust the perspective
correction. And so on. I'm probably going to solve some of these issues,
because they can be automated.