The Pascal 'with' statement is among the most hated features of
Pascal and was not copied in successor languages like Ada or Modula-2.
It was typically replaced by record constructors, such as
  Book1 := Book[title   : 'C Programming';
                author  : 'Nuha Ali ';
                subject : 'C Programming Tutorial';
                book_id : 6495407];
which happens to be Pascal (ISO10206).

In
  self classes do: [:class |
| metaclass |
metaclass := class metaclass.
metaclass xxxx.
mataclass yyyy.
  ]
"metaclass" is a a block temporary, not an instance variable,
and
   self classes do: [:each | (each metaclass) xxxx; yyyy].
suffices.

We observe that
  [:x1 ... :xn | ...] value: e1 ... value: en
is nothing other than a LET expression wearing a funny hat
and should be inlined by a compiler -- mine does -- and that
  e1 in: [:x1 | ...]
is just a "flipped" version of [:x1 | ...] value: e1, so
there's no reason why a compiler shouldn't inline that.
We also observe that
  e0 m1; ... ; mn
can -- at least in my experience -- be most simply implemented
as [:t | t m1. ... t mn] value: e0
followed by the usual inlining of that.
So we might expect that some day
  self classes do: [:each | each metaclass in: [:t | t xxxx. t yyyy]]
would generate the *same* code as the cascaded version.

Right now, do whichever is clearer.

On Tue, 5 Mar 2019 at 02:07, Tim Mackinnon <tim@testit.works> wrote:

> I’ve noticed that as we’ve progressed there has been a move to more
> concise and fluid code - e.g. I quite like the new String streaming stuff
>
> e.g.
>
> ^ String
> streamContents: [ :stream |
> stream nextPut: …. ]
>
>
> So I was wondering why we don’t have a construct like Pascals with  to
> avoid Book1.title, Book1.author etc.
>
> (* book 1 specification *)With Book1 dobegin
>    title  := 'C Programming';
>    author := 'Nuha Ali ';
>    subject := 'C Programming Tutorial';
>    book_id := 6495407;end;
>
>
> I often find it a bit tedious with code like the following which then
> needs an instvar...
>
> self classes do: [ :class |
> | metaclass |
> metaclass := class metaclass.
> metaclass xxxx.
> mataclass yyyy.
> ]
>
>
> I’m wondering why we don’t have #with:do:
>
> class with: class metaclass do: [:metaclass |
> metaclass xxx.
> ]
>
>
> But when such things aren’t there - there is usually a good reason and I’m
> curious … this said, there are all kinds of other such tricks (which I
> rarely use that I keep coming across).
>
> Tim
>
>

Reply via email to