« first day (398 days earlier)      last day (1331 days later) » 

12:24 PM
A change of day for the Informal APL learning session which takes place tonight (Tuesday) at 18:30 UTC in https://chat.stackexchange.com/rooms/52405/apl . See https://chat.stackexchange.com/transcript/message/41299896 if you don't have 20 Stack Exchange rep points
 
 
3 hours later…
3:18 PM
@Feeds School was cancelled yesterday due to weather, my history test got pushed back to Wednesday, and I'll probably be able to be here for the whole thing this time \o/
 
@Pavel Yay.
 
3:58 PM
A date for your diary ... Dyalog’18 will take place on 28th October - 1st November 2018 in Belfast, Northern Ireland - see https://www.dyalog.com/user-meetings/dyalog18.htm for more information.
 
 
1 hour later…
5:13 PM
I don't think I'll be able to be here for tonight's session
 
5:39 PM
@H.PWiz Too bad, but that's what transcripts and follow-up questions are for.
 
6:19 PM
So, what could I use Dialog for? Writing .NET programs/libraries?
 
@Hosch250 For example. But Dyalog APL is a general purpose language. What could you use other programming languages for?
 
Well, I mainly write C#/F#, so that's what I write.
For example, I have a checkers AI I'm writing in F#. I gather I could reference that DLL from a Dyalog program, or vice-versa, and it would be fully interoperable?
 
@Hosch250 Yes. Dyalog APL is on Microsoft's list of official .NET languages. You can pass .NET objects back and forth seamlessly.
 
Awesome. So, what organization develops Dyalog?
Is it sponsored by MS?
 
@Hosch250 Dyalog is the organization.
 
6:24 PM
@Hosch250 Dyalog Ltd. The language is called Dyalog APL.
 
OK.
 
@Hosch250 No. No ties. I'm not sure how we ended up on the list.
 
Btw I'll be able to finally attend today's session \o/
 
@Hosch250 Just as an example of how easy it is to use .NET from Dyalog APL: ⎕USING←'System' ⋄ ⎕NEW DateTime(2018 2 27 18 30 0)
@Hosch250 Pretty much anything you can write in C# can be written (shorter and simpler) in Dyalog APL.
 
@Adám If you can read Unicode characters :P
 
6:29 PM
@Hosch250 Well, if you know APL, of course.
Welcome to APL Cultivation!
We're going through classes as part of object orientated APL.
 
@Adám Except, as far as I can tell for the time being, iterators and generators.
 
Today, we'll actually begin to do stuff, using properties.
@Pavel This week, I'm working from home and John D (our OO guy) is in Italy. I have not forgotten. I'll ask him next week.
So far, classes have acted pretty much like restricted namespaces. Properties act much like fields/variables, but allow us to take special action when they are set or used.
Have a look at this code:
:Class Person

    :Field public name←'-'

    Upper←1∘(819⌶)
    Lower←0∘(819⌶)

    :Property Name
    :Access Public
        ∇ text←Get
          :If '-'≡name
              text←'I don''t have a name!'
          :Else
              text←'Hi, my name is ',name,'!'
          :EndIf
        ∇
        ∇ Set text
          name←(Upper 1↑text.NewValue),(Lower 1↓text.NewValue)
        ∇
    :EndProperty

:EndClass
You already know about fields from lesson 17.
Upper and Lower are two functions (methods) which just uppercase and lowercase.
Then we have a block which defines the property Name. It doesn't matter that it only has casing difference from the name field, but it is convenient to remember their connection.
The way properties work is that they have 1–3 specially named functions. Here, Name has Set and Get.
 
@Adám so Name ≠ name ?
 
@J.Sallé Correct.
Only system functions and keywords are case insensitive (user and system commands are too, but they're not really code). Identifiers are case sensitive.
 
makes sense
 
6:38 PM
The Get and Set functions have to be named thus, but you may case them as you want, to fit with whatever coding style you choose.
 
@Adám What's the 3rd function?
 
@Pavel The third one is called Shape, but it only applies to a special kind of properties which I don't think we'll have time to cover today.
 
Ok
 
So, Name will be treated as a public (due to the :Access declaration) field, but instead of directly setting a variable, the Set function will be called whenever one uses assignment syntax for Name.
However, Set doesn't just get the new value as argument. Rather, it gets a namespace with some members (you'll see later why). The important member here is NewValue, as you can see.
 
Can I have public Get and private Set?
 
6:42 PM
Get is called when one attempts to use the value of Name.
 
@Adám just to clarify, I couldn't just do Person1.Name←'name'?
 
You could, that's the point
 
@Pavel I'm not sure that even makes sense. If you can't "see" Name from the outside, then you'd be overwriting it if you attempt to set it.
@J.Sallé Yes you can. But under the covers, that'll call Set
 
@Adám That means you can see the value from outside, but only modify it from inside.
 
@Adám okay, I imagined such
 
6:45 PM
@Pavel You may omit one of Get or Set.
 
@Adám But I do still want to be able to modify it from inside.
 
@Pavel Sure, but from inside, you can call and assign to whatever you want. You may have more functions inside a property block, which you can then use to handle setting, etc.
@Pavel And maybe you can. I tried experimenting, but it didn't work out the way I expected, so I may have to take some time or ask about it.
 
Ok. If this was C#, our Person class might have a public int Age {get; private set;}. From the outside, I can only see Age's value, not tamper with it. From the inside, I could do Age++ at regular intervals.
 
@Pavel Right, I'm very sure you can do that here too. I just didn't take time to prepare an example of that for this lesson. I'll put it on my to-do list.
 
Thanks!
{get; private set;} is a very common pattern I'm used to.
 
6:50 PM
@Pavel Yeah. There are really a lot more details to all these things that what I cover in the lessons. E.g. you can declare members ReadOnly. But now we're getting off-track.
So, just to explain the actual code. :Field initialises the name to be a dash. Get will check whether name is a dash or not, and respond accordingly. Set will accept a character vector and make sure the casing is right (upper initial, rest lower) before assigning to name.
@all Clear?
 
perfectly
 
OK. Now of course, a class can have more than one property. Let's have a look at a fancier version:
:Class Person

    :Field age←0
    :Field name←'-'

    :Property Age
    :Access Public
        ∇ num←get
          num←⌊age
        ∇
    :EndProperty

    ∇ Grow amount
      :Access Public
      age+←amount
    ∇

    Upper←1∘(819⌶)
    Lower←0∘(819⌶)

    :Property Default Name
    :Access Public
        ∇ text←Get
          :If '-'≡name
              text←'I don''t have a name!'
          :Else
              text←'Hi, my name is ',name,'!'
          :EndIf
        ∇
        ∇ Set text
          name←(Upper⊃text.NewValue),Lower 1↓text.NewValue
So I've added two things. The most obvious one is the Age property and the complementary method Grow. That should all be understandable to you by now. If it isn't, please interrupt.
 
What does :Property Default mean?
 
@Pavel Right, that's the other change. Well spotted.
 
What's Lage?
 
6:59 PM
I think thats [Floor]age
 
@Hosch250 Floor of age
 
Ah.
 
@Hosch250 lol that's not L
...I'm a bit late
 
APL ninjas.
 
OK. Too used to UTF-8.
 
7:01 PM
Normally, objects are passed by reference while arrays are passed by value. But the monadic called Materialise has the ability to transform references into values. So if a method has a default property, then monadic will yield this property.
 
@Hosch250 ...*un* used, you mean, right? or you're feeling a bit dizzy?
dah why markdown why
 
Try it online:
https://tio.run/##hVJNT8JAEL3zK8bTQiwNxMQoN1REElOJBj2vdKlNtrubfoicTRAJISbGxKt/Qv/P/pG6u22xoIY5bd/Me9N5M1jQujvBlHtp2jqmOIqgT8KIs0oFVLROfUJdwB6R05dGGWI40Biqo7yyH3JBwngCbY9kSHs4JFovuaX@0EA65OwJWBIorkfiFQo5JhdznPPz4kyrw9yiQdZPy3RDPgYc8IQVQn/2VIK7SrpUqGXNYyCUpMo15ey9etA8lIvPmkmc87FJNMqJjUFPyAgnNAZHWbFt4pg8xEquuzZyqzcCZaB8/mCFxE/kDNQDlzOEYrjD9wSwMX4HlVU6NPqPfOZbEEwMB/wIkKVfFtrgM7c3@mV58edXJDZy5VVlu69m7s0fddp2yPga04TULOMdNOX0dS2xZan6yxxgmgp9CMs3p3NTHKOwnfzeji4HzgVSgD4zYZsT2LP314HGCpCLL/EN
 
wat
They're all UTF-8 characters
 
Yes, just dizzy.
 
Take your time to go to TIO and play with that one until it is clear.
 
7:04 PM
@Adám only one property can be set as default, I assume?
Also, is Default also case sensitive?
 
@J.Sallé Yes. That's the whole point of a default property. However, it may be an array, of course.
 
@J.Sallé No
 
@J.Sallé No, all those sub-keywords, like default public instance etc. are all insensitive.
 
@J.Sallé only identifiers are case-sensiitive :P
ninja again
 
Okay, got it.
 
7:05 PM
@EriktheOutgolfer Well, it just shows that you all pay attention. Makes me happy.
 
@Adám actually I only pay half the attention, but I don't have any issues :P
 
Now we're at it, I should mention that monadic on .NET collections materialises the collection's items: It returns an array of the .NET items that the collection consisted of.
 
(the tab title helps a bit)
 
You can of course make your class have that same behaviour by setting the default property appropriately.
 
What about on other kinds of .NET objects? I'm guessing on a System.String it makes it a character vector, but what about something miscellaneous like a System.DateTime?
 
7:10 PM
So, if you have a default property, you can read/write to the class instance directly, and it uses that property?
 
@Pavel Yes .NET strings become character vectors, but things that cannot be broken down (like DateTime) just stay the way they are.
@Hosch250 Only read. instance← would overwrite the name.
 
OK.
 
@Pavel OK, finally I'm going to answer your question.
 
Yay
 
The normal display of an object is with a namespace path and object name or class name/"namespace" in brackets. Not very useful.
⍞←⎕NS ⍬
 
7:13 PM
@Adám #.[Namespace].[Namespace]
 
However, there the system function ⎕DF (Display Form) allows you to change this to any character array:
⎕←ns←⎕NS ⍬ ⋄ ns.⎕DF 2 2⍴'yo' ⋄ ⎕←ns
 
@Adám
#.[Namespace].[Namespace]
 
Well that didn't quite work
 
@Pavel Nope. Try it online instead.
Of course, having a static display form like that isn't much fun.
Here is a better usage:
:Class Person

    ∇ Birth
        :Implements constructor
        :Access public
        ⎕DF 'baby'
    ∇

    Upper←1∘(819⌶)
    Lower←0∘(819⌶)

    :Property Name
    :Access Public
        ∇ text←Get
          :If 0=⎕NC'name'
              text←'I don''t have a name!'
          :Else
              text←'Hi, my name is ',name,'!'
          :EndIf
        ∇
        ∇ Set text
          name←(Upper⊃text.NewValue),Lower 1↓text.NewValue
          ⎕DF name
        ∇
    :EndProperty

:EndClass
So now we have a constructor which sets up the initial display form. And every time the Name property is Set, the display form is updated.
 
Can I make it so ⎕DF of an object isn't callable from the outside?
 
7:20 PM
@Pavel Hm, I don't think so. You want to prevent users from changing it?
 
Yeah
 
@Pavel That sure makes sense, and comes back to a question I've had for a long time: Why is ⎕DF a function rather than a variable. If it was a variable you could conceivably make it a readonly field.
 
Well, you could define a default property that printed your custom text?
 
@Hosch250 Yes, but that wouldn't show just when entering the object name. It requires to show up.
 
Oh, I see.
 
7:23 PM
@Pavel I've added it to my list of questions for JD.
I forgot to put ^ . Sorry.
Now, as you know, objects are passed by reference. So if we just try to grab the object value, we get a ref rather than the display form, even if the display form is what shows in the session. How do we get the actual display form? In C# it would be ToString of course.
Quiz: Any guesses?
 
Niladic ⎕DF?
 
@Pavel no way, niladic?
 
@Pavel Nope, since that's a monadic function, you can't call it niladically; you'd just grab the function itself (e.g. to use with an operator).
Think about it: If you have a numeric array, how would you get the character array display form?
 
@Adám but what if we want the actual value to not be a character vector?
 
@EriktheOutgolfer What actual value?
 
7:31 PM
@Adám like, not the reference, but the value that is where the reference points to
 
@EriktheOutgolfer There is no difference. Well, for a namespace, you could conceivably want a deep copy, but for classes? You want a new fresh instance?
is APL's ToString. So ⍕object will give you whatever argument has been fed to ⎕DF.
 
I don't think you can dereference classes like that in APL.
 
@Pavel What would it even mean? The memory location? That isn't useful in APL.
 
No, the other way around. Instead of having a pointer to an object, you have the actual data representing the object.
 
@Pavel As a name-value pairs' list? A JSON representation?
 
7:35 PM
No. As the raw representation. In APL an object is a pointer, right? Has a size of 4 bytes? Dereferencing it would yield the actual object in memory. It might be more or less than 4 bytes depending on the struct itself.
This wouldn't be a useful operation, I think.
 
@Pavel I agree.
But, since we're at it anyway, I think I mentioned that you can create a deep copy (so not a ref) of a namespace (including a class) with ⎕NS.
Another cool thing you can do is overtaking:
Remember how APL pads with the a fill element if there are not enough elements to go?
⍞←10↑3 1 4
 
@Adám 3 1 4 0 0 0 0 0 0 0
 
If a class has a niladic constructor, then overtaking an instance will create siblings (i.e. new instances of the same class) using the niladic constructor: Try it online!
 
Very similar to C++.
So, does Dyalog have null?
 
@Hosch250 Yes, ⎕NULL.
 
7:42 PM
OK.
 
@Hosch250 It isn't used much though. I usually see it representing empty cells in spreadsheets and occasionally as placeholder value for a ref.
 
Good.
I'm looking forward to no-null in C# 8.
 
Ikr
 
One thing that I use quite often is selecting cells in Excel, copying to clipboard, and then in APL, I place the cursor on a name and click "Paste as object". That makes the name hold a matrix of the speadsheet cells. Numbers are numbers, texts are character vectors, and empty cells are ⎕NULLs.
 
@Adám once again the APL implementation shows clear predilection for sorcery and wizardry.
 
7:49 PM
@J.Sallé ...or just the ability to parse the clipboard contents :P
with the Paste button passing the clipboard contents to some classification function
 
@EriktheOutgolfer Sorcery, I tell thee
 
Obviously, I cannot cover everything in these lessons, but here are a couple of things that properties can do as well:
You can have a :property numbered which acts like a normal property, but if you use indices to set or get, those functions are called with a namespace that has an Indexers member to tell the function which elements are being asked for.
Remember that I mentioned the Shape function of a property? This of course means that a property can have any (pretend) shape. So when Get or Set are called, the argument has a member called IndexersSpecified which is a Boolean vector indicating which dimensions are being addressed.
You can use this e.g. to implement sparse arrays.
 
The one and only APL cultivation that lined up with my schedule flawlessly: fire alarm goes off, school evacuates.
 
@Adám so, assuming :property numbered Grades, then I could do Student.Grades[1]←'A'⋄Student.Grades[2]←'B'?
 
@J.Sallé Yes, and even Student.Grades←'AB'.
 
7:59 PM
@Adám ah, okay. If there's already some information on that property, it'll just keep adding more indices whenever I call the set method again?
 
You can also have a :Property keyed which instead of numeric indices can use any arrays as keys. It is then up to the Set and Get functions to handle. Typically you'd want to use character vectors as keys. For such properties you must use indexing, as APL cannot know how many "elements" there are.
You can use this to implement dictionary objects.
@J.Sallé Well, you must have a Shape function for numbered properties to tell APL how many elements there are, but of course, that function can give a dynamic result.
 
@Adám I see
 
Thank you so much for participating!
 
Thanks for hosting us.
 
@Pavel Murphy's law.
 
8:03 PM
@Adám IIRC we refer to Murphy for bad luck, not good luck :)
 
Another question: Can I have a class with properties that are only existent (or visible, at least) if some condition is met? I'm bringing it to a Magic: the Gathering context now, but for instance, only cards with the type Creature have the properties Power and Toughness. Can I just extend/specialize a general Class Card into a Creature class?
 
@Adám You just violated Muphry's law.
 
@EriktheOutgolfer that was bad luck, though
 
@J.Sallé not having school? it's like the best thing that could ever happen, although teachers often complain about it
 
@J.Sallé In other words, does APL have a base class?
 
8:05 PM
@EriktheOutgolfer maybe if you see it that way, but I believe Pavel wanted to stay in so he could attend the session
 
@J.Sallé I thought he was home attending the session though...
 
@J.Sallé As you say, one way to do it is to have a general base class, and the special classes are based on those. Another way would be for Get to check that conditions are met and throw an error (e.g. value error) otherwise.
 
@Adám okay great! That's gonna make things so much easier :p
@EriktheOutgolfer from what I deduced, he was at school. I might be wrong though
 
@Hosch250 Oh, right, I didn't cover that. Yes, you can specify a base class in the class header just by appending colon-baseclass, e.g. :Class Creature : Card
 
Very similar to C#.
 
8:08 PM
@Hosch250 Maybe next lesson should cover base classes, base constructors, interfaces… ?
 
@J.Sallé then how could he type "school evacuates"? shouldn't he be evacuating instead? ;P
 
@EriktheOutgolfer I think he wrote that when he came back inside.
 
@Adám I'd like that very much
 
@Pavel What really happened?
 
@Adám back inside...? oh what an unlucky man
 
8:09 PM
@Hosch250 Indeed. Dyalog APL's object model is made to match C#'s. It isn't a .NET language for nothing.
@Hosch250 You can even make a APL class with a .NET classes as base class. E.g. a fancier DateTime.
 
Does Dyalog have any characteristics of functional languages, like function currying, etc?
 
@Hosch250 Oh yes. If you want, you can go fully functional, and tacit too.
 
Cool.
 
@Hosch250 Someone tried to reverse-engineer a cotton candy machine and it blew up
 
And finally, what's the business motivation behind the language. I know languages cost a lot to develop, so what's driving it?
 
8:12 PM
@EriktheOutgolfer On my phone
 
@Pavel A born engineeer.
 
@Pavel a cotton candy machine of all things? Why would anyone do something so hideous to such a great provider of sugary treats? D:
 
¯\_(ツ)_/¯
 
@Hosch250 Idealism :-) Dyalog is not free for real commercial usage. We have a few very large customers who pay substantial licensing fees…
 
Bet they are some of our customers too.
 
8:14 PM
@Adám What do you do at Dyalog? You talk about the .NET guy and the OO guy, I was wondering what your role is.
 
@Pavel he is known just as The Guy
god I wish we had some twitch-like emotes in this chat ⍨
 
@Pavel I'm the HQ APLer. Most staff there write C(++) to implement APL. I actually know and use it. I develop and maintain tools, test the system, provide language ideas, customer support, etc. etc.
@J.Sallé JD is officially the Chief Architect. He drives a Mazda roadster with the registration DL06 APL. How cool is that‽
 
Extremely cool
 
@Adám he joined in 2006, right?
 
@Adám that's I want to be that guy cool
 
8:20 PM
@EriktheOutgolfer No, UK plates are very restrictive, so people substitute digits for letters. It says D(ya)LOG
 
@EriktheOutgolfer The website says 1991
 
@Hosch250 E.g. you can change the dyadic function + into "increment" with +∘1
 
@Pavel yeh, he's probably one of the oldest employees in there
 
@Adám Cool.
 
@Hosch250 And you can make the power operator (a.k.a. repeat-n-times higher-order function) into "applyu-twice" with ⍣2
@Hosch250 If you have not done so yet, I suggest reading through the earlier lessons. The first ones establish fundamental concepts.
 
8:29 PM
Yeah, it's on my todo list :(
 
Also if you hadn't noticed, Adam's a great teacher.
 
@J.Sallé Thank you. I appreciate the compliment.
 
I think it's because he lets the code speak for itself.
 
@Adám I should know. Both my parents have been teachers for over 30 years.
 
@Hosch250 I guess APL is elegant enough to let that happen.
 
8:33 PM
Most languages are.
 
ngn
@J.Sallé +1
 
Except maybe Folders and Whitespace.
 
ngn
@Adám are you planning to give more lessons on actual apl (not oo)?
 
@Hosch250 have you ever seen Jelly? :p
 
@ngn Good question. I've covered almost all the glyphs. I'm thinking of doing parallelisation using both APL threads and isolates. Any ideas?
 
8:35 PM
@J.Sallé Occasionally.
@Adám Sounds fun.
Although, why wouldn't you use the .NET TPL?
 
ngn
@Adám it seems natural to have one about commonly used patterns at some point, but threads&isolates might also be interesting
@Adám (that was just an idea off the top of my head, I didn't think hard about it)
 
@Adám Perhaps it would not be possible to teach, but just knowing the glyphs isn't quite enough. Some kind of problem based teaching could be nice, but again, I don't know how it could be formatted and it would likely be time consuming. As ngn said, going over patterns/idioms could be a good approach
 
@Hosch250 Because Dyalog doesn't support .NET cross-platform, and it is way cooler to have built-in functionality. The isolates method is awaiting more testing before we enable the reserved glyphs. The idea is that you should be able to apply a function to each of element of an array, each running in a different process, using Function∥¨array
 
Sounds cool.
So, Parallel.Foreach wouldn't work?
Probably not, if Task.Run wouldn't.
 
ngn
@Hosch250 is that c#?
 
8:40 PM
It's .NET.
 
@Hosch250 That's how it is currently, but APL doesn't have reserved words. (Or isn't supposed to; there are some special things in OO.)
 
ngn
@Hosch250 it won't work on linux
 
Ohh, makes sense.
Unless you are using .NET Core, of course.
 
@Hosch250 Yeah, we really need to get our act together and support .NET Core/Mono. So much to do…
 
@Adám That's not a reserved keyword. It's just a method.
 
8:42 PM
@Hosch250 What isn't a reserved keyword?
 
The Parallel.Foreach.
 
@H.PWiz I'd like to extend that idea into maybe fitting somewhere in the schedule a day to solve some choice PPCG challenges in APL, with golfing not necessarily in mind
 
@Hosch250 but there are other reserved keywords in classes though, such as :field public (where public can't be the name of a field), etc.
 
OK.
 
ngn
8:43 PM
@EriktheOutgolfer I consider that Not APL :)
 
@EriktheOutgolfer Which is really strange. The last word on the line is the member name, so there is no ambiguity, and thus no need to prohibit it.
 
@ngn yeh Dyalog kind of diverts from other APLs (note: can't compare with IBM APL2, since there isn't even a trial version at all)
 
@EriktheOutgolfer Uh, yes there is: APL2 Trial. Good luck. I promise you that you'll feel handicapped.
 
@Adám Why does this print?
 
@Pavel Because you cannot use )off in code. It isn't a function.
 
8:47 PM
I can't use ⎕off either, it leads to same thing. What can I do?
Well, not quite the same thing. Different error before printing.
 
@Adám no, I don't think there's any trial there, I think it got removed recently
(I tried to download it before too)
that's what I was referring to
 
@Pavel That's only because of the TIO wrapper. Try it online!
@EriktheOutgolfer Oh wow, I didn't know. Interesting. I have it installed.
 
@Adám if you have a trial, you may want to uninstall it
 
@EriktheOutgolfer Why?
 
@Adám hm, does the license contain anything related to that?
 
8:50 PM
There needs to be a good way to run Dyalog as a script an exit.
 
@EriktheOutgolfer Related to what? I have to check their website every day to see if it is time to uninstall? It is a limited trial edition.
 
ngn
@Pavel there is "dyalog -script"
 
@ngn That's not the same thing
Then I have to pipe in the script, and it can't read input.
 
@Pavel Yes. We're working on that. Meanwhile, if you pipe into ^^^, APL will quite when the last program terminates and there's nothing to read.
 
@Adám I think that if it lets you fully use it even after the trial period expires, then you illegally own it and must completely remove all traces of it, but I'm not sure at all, since I can't have any access to the, well, trial at all anymore
 
ngn
8:52 PM
@Pavel right, that's true
 
@EriktheOutgolfer But it doesn't. It counts how much CPU time I've used and that has a cap.
@Pavel Marshall and I have a project to allow #! scripts.
 
:)
 
ngn
@Adám good luck, I was pushing for this too
 
@ngn It is definitely happening now.
 
Does ngn work for Dyalog too?
 
8:59 PM
Used to
 
not anymore
 
What did he do?
 
ninja'd
 
I think he left in January 2015 or something
 
ngn
@Hosch250 Dec 2016
 
8:59 PM
@Hosch250 Among other things, he wrote the code upon which the current cross-platform IDE is based.
 
Ah.
So he's a C/C++ ninja?
 
@Adám Would that be RIDE?
 
@Hosch250 Well, it is written in JavaScript.
@Pavel Yes.
 
ngn
@Adám half of it - there's also an interpreter part
@Hosch250 a c/c++ amateur sumo wrestler :)
 
@ngn Ah, yes, I guess you could look at it like that. You wrote the GUI.
@ngn You did work on the interpreter too, didn't you? Before I joined.
 
ngn
9:02 PM
@Adám yes for a few months
 
OK, I've got to go. Was a pleasure. Hope to see you all around. Keep asking questions!
 
See you.
 
o/
 
ngn
@Adám the inability to read from stdin is actually quite a drawback... keep on pushing for proper #!
 
 
2 hours later…
10:51 PM
 

« first day (398 days earlier)      last day (1331 days later) »