Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Get the object structure correct.

85 views
Skip to first unread message

Jonas Thörnvall

unread,
Jan 18, 2018, 5:50:35 AM1/18/18
to
function makeTrack()
{
for (var m = 0; m < 101; m ++ )
{
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
time:[],
data0:[],
data1:[],
data2:[]
};
}
defaultTrack();
return track;
}

Try to get the object structure correct for easier sorting, i am pretty cluess about howto write objects the way i realy would like them. I probably could do an elaborate sort on the object above but it seem a bit of waste when javacript to have sort();

How can i write an object where data0,data1,data2 as properties of time?


Jonas Thörnvall

unread,
Jan 18, 2018, 6:03:51 AM1/18/18
to
Well to be properties of time rather then arrays?

Michael Haufe (TNO)

unread,
Jan 18, 2018, 5:39:39 PM1/18/18
to
Jonas Thörnvall wrote:
> function makeTrack()
> {
> for (var m = 0; m < 101; m ++ )
> {
> track[m] ={
> outport:[],
> portname : [],
> midichannel:[],
> program:[],
> time:[],
> data0:[],
> data1:[],
> data2:[]
> };
> }
> defaultTrack();
> return track;
> }
>
> Try to get the object structure correct for easier sorting, i am pretty cluess about howto write objects the way i realy would like them. I probably could do an elaborate sort on the object above but it seem a bit of waste when javacript to have sort();

<script>
class Track{
constructor(id) {
this.id = id;
this.outport = [];
this.midichannel = [];
this.portname = [];
this.program = [];
this.time = [];
this.data0 = [];
this.data1 = [];
this.data2 = [];
}

toString(){ return `new Track(${this.id})`}
}

// generate 100 tracks
let tracks = Array.from({length:101},(_,i) => new Track(i))

//reverse order
tracks.sort((a,b) => b.id - a.id)

// convert to string
tracks.join(",")
</script>

Jonas Thörnvall

unread,
Jan 18, 2018, 7:38:29 PM1/18/18
to
Hello Michael thanks for your answer i do not see how that would make dataX a property of time? But i confess i have very bad understanding of objects, and maybe do not understand your code.

Basicly i would like a structure that make
track[x].time.sort()

possible and since data0,data1,data2 would be "properties?" of time, that the only thing that would need to be done to sort the messages?

How would your structure make that possible?

I probably do not understand the constructor id
tracks.sort((a,b) => b.id - a.id)
And i do not understand what is sorted here, but my guess it is not timed events?

data0,data1,data2 are part of a message generated "for example" on keystroke they get a time code for the event.

You cannot overdub record, "splice" new messages/events in realtime **at least that is what i suspect** it cause latency.

So i have a playtrack ***mixtrack*** 0, that is played when you record selected track, but that mean the events will not be sorted until you stop recording.

First the events upon the recorded track is sorted by time[index] that is why i want data0,data1,data2 to be properties of time. Because then i can just sort them by track[x].time.sort(); correct?

Last step After each new recording to a track ***all selected tracks*** are downmixed to track zero. And sorted this is the mastertrack that play all events.

for (var i=0;i<track.length;track++){
track[i].time.sort();
}

To me the above, seem to be the way todo it, given that i can't see how timed events would be sorted using your approach?

I can really need the help here because if can do this, i think the actual functionality to play and record tracks -> "bar intervals" using metronome is done.

And i can go on to build first a bar overview/editor "copy,paste" a function to buildup song using snippets dragged on canvas. And later a graphical event editor.

I just would like to finnish the actual recording/play device first.

Jonas Thörnvall

unread,
Jan 18, 2018, 7:56:48 PM1/18/18
to
The structure should be like this i have a track array, each track hold an indexed message array "that store time".
Each "timed" event hold three single valued properties "integers" data0,data1,data2.

But my syntax skills in the language is not sufficient to buildup/make that structure "object or not" but i guess all structures in javascript are objects?

Jonas Thörnvall

unread,
Jan 18, 2018, 8:19:44 PM1/18/18
to
Well i try to look at examples but the syntax just over myhead.

var People = [
{Name: "Name", Surname: "Surname"},
{Name:"AAA", Surname:"ZZZ"},
{Name: "Name", Surname: "AAA"}
];
I guess people is an array holding three indexes above?
The properties of people is Name and Surname

So i can set Peoples properties by
People[3].Name="Jonas";
People[3].Surname="Thörnvall";
Right?

If i try to translate it using my mind to my example i end up with this?
It is hard when the structure of language syntax turns into guesswork.

for (var m = 0; m < 101; m ++ )
{
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
time:[{data0:0, data1:0, data2:0}]
};
}
return track;
}

Michael Haufe (TNO)

unread,
Jan 18, 2018, 8:24:14 PM1/18/18
to
Jonas Thörnvall wrote:

> Hello Michael thanks for your answer i do not see how that would make dataX a property of time? But i confess i have very bad understanding of objects, and maybe do not understand your code.

What you need to do is first figure out what your data structures are. Once you do you can minimize the code you have to write.

Think of every "noun" as a class you should make, and every "verb" as a method of those classes.

Properties are the relationships between them.

right now you're concepts are Track (which I defined earlier), and apparently Time.

Can you make a list of more?

Don't overthink it and stay focused.

I guarantee many things will become obvious for you once you go through this exercise.

Michael Haufe (TNO)

unread,
Jan 18, 2018, 8:33:49 PM1/18/18
to
Jonas Thörnvall wrote:

> Well i try to look at examples but the syntax just over myhead.
>
> var People = [
> {Name: "Name", Surname: "Surname"},
> {Name:"AAA", Surname:"ZZZ"},
> {Name: "Name", Surname: "AAA"}
> ];
> I guess people is an array holding three indexes above?
> The properties of people is Name and Surname

JavaScript developers have a tendency to "golf" [1] their code just like Perl programmers. Which can make things unnecessarily terse.

I would have wrote the example like this:

</script>
class Person {
constructor(name, surName) {
this.name = name;
this.surName = surName
}
}

var people = [
new Person(Brendan", "Eich"),
new Person("Alan","Kay"),
new Person("Robert", "Carlyle")
]

people.push(new Person("Jonas", "Thörnvall"))
</script>


[1] <https://en.wikipedia.org/wiki/Code_golf>

> So i can set Peoples properties by
> People[3].Name="Jonas";
> People[3].Surname="Thörnvall";
> Right?

Right, you could, but the meaning of those objects are implied. My example is explicit.

Jonas Thörnvall

unread,
Jan 18, 2018, 8:41:50 PM1/18/18
to
Well i think i want the choice for the tracks to be played on different ports "each port can be an instrument" and also different midichannels and programs.

So i keep those as arrays, portname is good if you store the structure and the port order change.

To my surprise my guesswork of howto create the object worked, no protests.
But it seem that time have to be a property of the message.
So lets see if i can reach and set messages using

track[x].midimessage[x].time=time;
track[x].midimessage[x].data0=mididata0;
track[x].midimessage[x].data1=mididata1;
track[x].midimessage[x].data2=mididata2;

But then i am lost on howto sort using time
track[x].midimessage.time.sort();
That does not seem correct?

This is what confuse me before i could store a time message in time but now it been downgraded to a property of message so how do i sort the array using the property.







Michael Haufe (TNO)

unread,
Jan 18, 2018, 8:47:14 PM1/18/18
to
Jonas Thörnvall wrote:

> This is what confuse me before i could store a time message in time but now it been downgraded to a property of message so how do i sort the array using the property.

<script>
someArray.sort(function(a,b) {
return a.propertyName - b.propertyName
})
</script>

See: <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort>

Jonas Thörnvall

unread,
Jan 18, 2018, 9:30:09 PM1/18/18
to
After changing structure, i can no longer record/assign values to the new properties of midimessage array? Uncaught TypeError: Cannot set property 'time' of undefined

function makeTrack()
{
for (var m = 0; m < 101; m ++ )
{
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
midimessage:[{time:0,data0:0,data1:0,data2:0}]
};
}
defaultTrackValues();
return track;
}
function defaultTrackValues(){
for (var m = 1; m < 16; m ++ ){
track[m].outport[0]=document.getElementById("out_portsel").selectedIndex;
track[m].portname[0]=document.getElementById("out_portsel").value;
track[m].midichannel[0]=m;
track[m].program[0]=document.getElementById("prog_sel").value;
}
}

Here is where i record them.
function record(message){
clock=clock+rs;
midievent++;
track[tracknr].midimessage[x].time=clock;
track[tracknr].midimessage[x].data0= message.data[0];
track[tracknr].midimessage[x].data1= message.data[1];
track[tracknr].midimessage[x].data2= message.data[2];
x++;
console.log("Track="+tracknr);
}

Jonas Thörnvall

unread,
Jan 18, 2018, 9:46:30 PM1/18/18
to
It probably relate to people.push(new Person("Jonas", "Thörnvall"))
new track[tracknr].midimessage(clock,message.data[0],message.data[1],message.data[2]);

How do i set and reach messages in my proposed structure.

Jonas Thörnvall

unread,
Jan 18, 2018, 9:54:32 PM1/18/18
to
Maybe i should just loop thru like i do for tracks create the messages but i must do it for each track?

Jonas Thörnvall

unread,
Jan 18, 2018, 10:00:49 PM1/18/18
to
But it seem weird, if i create 10 000 messages for 100 tracks?
And make new message objects while you record seem crazy, it take time and create latency? If they just were dynamic? arrays, they would not take any place now i have to allocate 10000*3 byte on 100 tracks?

Jonas Thörnvall

unread,
Jan 18, 2018, 10:54:20 PM1/18/18
to
I decided to dwelve into the mysteries of objects reading your code, i can see the constructor similar to record from COBOL. It is just a construct hold no data.

Then you have a variable people that is an array, could been empty to start with but you show as example var people[];

No problems, and then you use the constructor Person to push in a new member? into the variable people. So people is an instance object of Person,we could have many variables using the class constructor Person holding different persons.

What is the time difference between push an object vs assign and read values to/from array?
Because messages objects will be created on the fly pressing keys, but also must be accessed on the fly "read" depending on timer. That is a concern that push objects and read them is slower then array handling.

I can do a constuctor just for fun.

class Track {
constructor(port,midichannel,program,midimessage) {
this.tracknr=tracknr;
this.port = port;
this.midichannel = midichannel;
this.midiprogram = program;
this.midimessage = midimessage;
}
}

class midimessage {
constructor(port,midichannel,program,midimessage) {
this.time = time;
this.data0 = data0;
this.data1 = data1;
this.data2 = data2;
}
}

But i have a message object with properties, is that a class in its own?

I do not understand how to make an object where properties have have?
"A property midimessage of track that hold, properties of it own?"

Maybe it is not even necessary but i do not like the application to shuffle unnecessary data? There is no point to shuffle trackdata creating a new message object but the messages still need to be connected to a track?

Is there subclassing, but then there is even more new syntax to learn.

I honestly prefer if someone show me howto create new midimessages using my old structure.

function makeTrack()
{
for (var m = 0; m < 101; m ++ )
{
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
midimessage:[{time:0,data0:0,data1:0,data2:0}]
};
}
defaultTrackValues();
return track;
}
function defaultTrackValues(){
for (var m = 1; m < 16; m ++ ){
track[m].outport[0]=document.getElementById("out_portsel").selectedIndex;
track[m].portname[0]=document.getElementById("out_portsel").value;
track[m].midichannel[0]=m;
track[m].program[0]=document.getElementById("prog_sel").value;
}
}

//Below function where i record them but i have not created any messageobjects.<
//So not working
//How can i either use new to create midimessages
//Or should i do like with track create messages?

Thomas 'PointedEars' Lahn

unread,
Jan 18, 2018, 10:56:09 PM1/18/18
to
Michael Haufe (TNO) wrote:

> Jonas Thörnvall wrote:
>> var People = [
>> {Name: "Name", Surname: "Surname"},
>> {Name:"AAA", Surname:"ZZZ"},
>> {Name: "Name", Surname: "AAA"}
>> ];
>> I guess people is an array holding three indexes above?
>> The properties of people is Name and Surname
>
> JavaScript developers have a tendency to "golf" [1] their code just like
> Perl programmers. Which can make things unnecessarily terse.

But often also less error-prone. YMMV.

> I would have wrote the example like this:
>
> </script>
> class Person {
> constructor(name, surName) {
> this.name = name;
> this.surName = surName
> }
> }
>
> var people = [
> new Person(Brendan", "Eich"),
> new Person("Alan","Kay"),
> new Person("Robert", "Carlyle")
> ]

Names starting with a capital letter should be reserved for constructors,
classes and constants That is, “People”, “Name”, and “Surname” should all
be lowercase here.

Using the same pattern as you used for “tracks”, one can set up the data and
have the custom instances without repeating oneself (ES 2015+):

people = people.map((obj) => new Person(obj.name, obj.surname));

or, more backwards-compatible (ES Ed. 5+):

people = people.map(function (obj) {
return new Person(obj.name, obj.surname);
});

Or, most backwards-compatible (all):

for (var i = people.length; i--;)
{
var obj = people[i];
people[i] = new Person(obj.name, obj.surname);
};

If the class/type has a default constructor (and this is one example that
show that it is a good idea to have one), and provides means to set
individual properties, then this can be even simpler. For example:

people = people.map((obj) => {
var person = new Person();
Object.assign(person, obj);
});

It is also a good idea to have a constructor that in addition to positional
arguments accepts an initializer object as first and only argument.

people = people.map((obj) => new Person(obj));

Such a constructor is particularly useful with JSON.parse(json, reviver),
and in general it is a good idea if a constructor can be called as a
function for type conversion (like type casting). But apparently this is
not possible with ECMAScript classes:

class Person
{
constructor (...args)
{
if (!(this instanceof Person)) return new Person(...args);

/* initialize */
}
}

/* TypeError: Class constructor Person cannot be invoked without 'new' */
Person()

This works:

function Person (...args)
{
/*
* For backwards compatibility JSX:object.js introduces
* Function.prototype.construct(), and I am also thinking about
* adding Function.prototype.toFactory() for DRY.
*/
if (!(this instanceof Person)) return new Person(...args);

/* initialize */
}

/* > Person {} */
Person()

BTW, one should have read <http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/>.

--
PointedEars
FAQ: <http://PointedEars.de/faq> | <http://PointedEars.de/es-matrix>
<https://github.com/PointedEars> | <http://PointedEars.de/wsvn/>
Twitter: @PointedEars2 | Please do not cc me./Bitte keine Kopien per E-Mail.

Mark-

unread,
Jan 18, 2018, 11:03:47 PM1/18/18
to
Thomas 'PointedEars' Lahn wrote:

> Names starting with a capital letter should be reserved for
> constructors, classes and constants That is, “People”, “Name”, and
> “Surname” should all be lowercase here.

Poppycock.

Jonas Thörnvall

unread,
Jan 18, 2018, 11:06:51 PM1/18/18
to
I like the old version Thomas
for (var i = people.length; i--;)
{
var obj = people[i];
people[i] = new Person(obj.name, obj.surname);
};

But if Person was initself a property of adress would i then write as below
to create a new person object on the adress. It is the syntax that escapes me.

for (var i = people.length; i--;)
{
var obj = people[i];
residence[x].people[i] = new Person(obj.name, obj.surname);
};

Jonas Thörnvall

unread,
Jan 18, 2018, 11:30:17 PM1/18/18
to
I have problem to find example complex enough to really translate to my problem.

So let my give an analogy to my object.

A regional income database, store adresses, on each adress live many people. Each of these people have properties fortune, income, expenditures.

I do understand what you write on those simple objects, but i cannot elevate the knowledge to my problem. Because it is layered. If you show me this i probably can figure it out for any "structure" / prototype i need to create.

Jonas Thörnvall

unread,
Jan 18, 2018, 11:49:51 PM1/18/18
to
Den fredag 19 januari 2018 kl. 05:06:51 UTC+1 skrev Jonas Thörnvall:
Lets skip the objects prototypes and take it the easy way.
Does not this code create 100 track "objects?" with 5 properties, but one of the properties is a "object?" in its own midimessage that has its own properties?

Right or wrong, that is how i interpreate the code and it pass so "is something".

However i am unable to pass values, "because i suspect just a with the track the messages must be created.

Right or wrong?
This does not work
track[tracknr].midimessage[x].time=clock;
Uncaught TypeError: Cannot set property 'time' of undefined

So the message object do not exist on the track, SO HOW CAN I MAKE ONE???
It seem easier **TO SOLVE THIS** problem then to overhaul all the code and start make class objects and prototypes, when there is no examples given complex enought to match my prefered storage structure.

function makeTrack()
{
for (var m = 0; m < 101; m ++ )
{
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
midimessage:[{time:0,data0:0,data1:0,data2:0}]
};

}
defaultTrackValues();
makeMessages();
return track;
}

Jonas Thörnvall

unread,
Jan 19, 2018, 3:12:16 AM1/19/18
to
I just do not get it...
I realised that the structure i did not quite understand so i though i go for something easier. I break out the message. But i still get same error message?
It is basicly the same as creation of tracks, and i have no problem assig values to them.

function record(message){
clock=clock+rs;
midievent++;
midimessage[1].time=clock;
midimessage[1].data0= message.data[0];
midimessage[1].data1= message.data[1];
midimessage[1].data2= message.data[2];
x++;
console.log("Track="+tracknr);
}

function newMessage(n)
{
midimessage[n]={
time:0,
data0:0,
data1:0,
data2:0
};
return midimessage;
}

function makeTrack(){
for (var m=0;m<101;m++){
newTrack(m);
for (var n = 0;n < 10000; n++){
newMessage(n);
}
}
defaultTrack();
}


Jonas Thörnvall

unread,
Jan 19, 2018, 5:01:54 AM1/19/18
to
Well i decided to keep my structure and sort the timed messages in three data fields using a routine of my own and skip sort(), because i will not resolve the structure needed. And then i don't have to change anything else.

John G Harris

unread,
Jan 19, 2018, 6:20:37 AM1/19/18
to
Has he done this?

A little while ago he was cursing someone for writing code with no
useful comments in it. Why? He doesn't.

John

Jonas Thörnvall

unread,
Jan 19, 2018, 2:48:24 PM1/19/18
to
Comments doesn't bother me i don't need them, meaningfull syntax on the other side and its opposite. What is the point to make excercises that do not apply to the problem at hand. I could make a constructor but it would not apply to my problem, because the object is layered. And maybe it is two objects in javascript a message and a track, i have no idea.

I just can state that i think i had a structure that may had worked but i had no idea how to put a message into it.

I do not even know if it has the correct format it is just guesswork on my part.
I still wait for someone to say either that the structure is wrong, or how i can put a midimessage into it. Because i tried and get midimessage not defined all variants that i guessed how to do it.

I do not think i need a class constructor, this would work just fine. But i do not know howto assign/create a new midimessage?

function newTrack()
{
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
midimessage:[{time:0,data0:0,data1:0,data2:0}]
};
return track;
}

John G Harris

unread,
Jan 19, 2018, 3:03:27 PM1/19/18
to
On Fri, 19 Jan 2018 11:48:13 -0800 (PST), Jonas Thörnvall
<jonas.t...@gmail.com> wrote:

<snip>
>I still wait for someone to say either that the structure is wrong, or how i can put a midimessage into it.
<snip>

How would we know when the code you copied has no useful comments and
no documentation.

John

Jonas Thörnvall

unread,
Jan 19, 2018, 3:19:08 PM1/19/18
to
I can't see what there is to comment upon the code i wrote, the "code" structure make a new track. I know howto make a new track.

So for the last time "what is the fucking syntax" to put a midimessage into it.

***IF THAT IS POSSIBLE***

Or what do you want me to comment on? It is a track and i can access the properties of it ***but not midimessage***
That i think i given properties of its own?

You see I am not sure i did it correct because the syntax of javascript is somewhat horrible when it comes to multidimensinal **thingies** that have properties. I've tried to assign values to the time and data properties.

But i get that the midimessage do not exist, ***BUT I DO NOT KNOW HOWTO CREATE THEM***

The answer to the question is probably a oneliner of javascripts horrible syntax that i just can't figure out.

But i can't comment on the structure what do you want me to comment, is there anything to comment on it what?

Jonas Thörnvall

unread,
Jan 19, 2018, 3:48:33 PM1/19/18
to
Well i do not know what you want me to comment.
But i can show you howto create a track that is easy.
for (var m=0;m<16;m++){
newTrack(m);
}

And i can show you howto assign a value to one of the properties of track.
track[m].program[n]=128
You see that was easy.

Unless the property is midimessage, "that has properties of its own".

Now can anyone show me how to assign a value to time in midimessage.
I know it is undefined, "chrome tells me so", so i understand i must create just like i create tracks.

***BUT I DO NOT KNOW THE SYNTAX*** for howto do it.
It is a oneliner....

Jonas Thörnvall

unread,
Jan 19, 2018, 4:02:33 PM1/19/18
to
Yeah i tried track[m].midimessage[n] it does not work for me,should it?

for (m=0;m<16;m++){
for(n=0;n<10000;n++) {
track[m].midimessage[n];
}
}

Jonas Thörnvall

unread,
Jan 20, 2018, 9:07:45 PM1/20/18
to
Well it pass without error but the properties of midimessage[n] "time,data0,data1,data2" are still undefined?

And that seem weird to be because if those ***properties time,date were on the track level***, they would been created and accessible to assign values.
Ater i looped and created the tracks, i could do assignments.

for (m=0;m<16;m++){ track[m].midimessage[n]; }
I would have no problem to write
track[m].time=100.0003
track[m].data0=128;

But when the properties belong to midimessage.
for (m=0;m<16;m++){
for(n=0;n<10000;n++) {track[m].midimessage[n];}
}

I can't do
track[m].midimessage[n].time=100.0003
track[m].midimessage[n].data0=128;

So i probably do not understand the structure?

Why can i assign property time, cataX in this structure.
track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
time:[],
data0:0,
data1:0,
data2:0
};

But not in the leveled structure

track[m] ={
outport:[],
portname : [],
midichannel:[],
program:[],
midimessage:[{time:0,data0:0,data1:0,data2:0}]
};

Please help me out with this.
Why can't I

track[m].midimessage[n].time=1000.1234

The midimessages are created using loop below, so why are time and the dataX still undefined and not possible to assign values after loop run?

for (m=0;m<16;m++){
for(n=0;n<10000;n++) {track[m].midimessage[n];}
}//This work, however the properties of midimessage are unreachable.


Jonas Thörnvall

unread,
Jan 21, 2018, 3:56:08 AM1/21/18
to
1. Do you understand this question/problem with midimessage and assign its properties?
2. Do you know the answer to it?

If i could find examples i surely would look them up. But i have not seen any properties of a "subarray" get values assigned.

Thomas 'PointedEars' Lahn

unread,
Jan 25, 2018, 1:50:11 AM1/25/18
to
Jonas Thörnvall wrote:

> [full quote]
> […]
> But if Person was initself a property of adress would i then write as
> below to create a new person object on the adress. It is the syntax that
> escapes me.
> […]

Too bad. But that is living testament either to your veracity
or the reliability of the results of IQ tests. [1]

_______
[1] <news:2db62a9d-9048-4ecf...@googlegroups.com>
<https://groups.google.com/d/msg/comp.lang.javascript/paDy9O_kOdc/di8NO_kbCwAJ>

Jonas Thörnvall

unread,
Jan 30, 2018, 4:07:01 AM1/30/18
to
Well i know you hardly have 120 in IQ that is why you have to walk around with a support cain up your ass, to feel selfimportant i should not say that all ENTP are average IQ there is of course exceptions. But the crutch up your ass that make you anal retentive it will not make you solve any real problems.
Message has been deleted

Thomas 'PointedEars' Lahn

unread,
Jan 30, 2018, 5:01:18 AM1/30/18
to
</killfile>

Jonas Thörnvall wrote:

> [self-aggrandizing nonsense]

I am glad that I did not waste more than those few lines on you.

<killfile>

Mark-

unread,
Jan 30, 2018, 8:37:59 AM1/30/18
to
Thomas 'PointedEars' Lahn wrote:

> </killfile>
>
> Jonas Thörnvall wrote:
>
> > [self-aggrandizing nonsense]
>
> I am glad that I did not waste more than those few lines on you.
>
> <killfile>

Publicly taking this action (adding a person to a killfile) is very
sad, immature and grand standing.

John G Harris

unread,
Jan 30, 2018, 2:14:16 PM1/30/18
to
On Tue, 30 Jan 2018 11:01:13 +0100, Thomas 'PointedEars' Lahn
<Point...@web.de> wrote:

>Jonas Thörnvall wrote:
>
>> [self-aggrandizing nonsense]

Thomas said :
> [Thomas tells lies]

John, writing in the style of Thomas :-(
0 new messages