From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.io/gmane.comp.tex.context/113340 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Ramkumar KB via ntg-context Newsgroups: gmane.comp.tex.context Subject: Re: Any initial thoughts on luau? Date: Tue, 9 Nov 2021 09:35:54 +0800 Message-ID: References: Reply-To: mailing list for ConTeXt users Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="===============3528945465594479228==" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="20098"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Ramkumar KB To: mailing list for ConTeXt users Original-X-From: ntg-context-bounces@ntg.nl Tue Nov 09 02:36:49 2021 Return-path: Envelope-to: gctc-ntg-context-518@m.gmane-mx.org Original-Received: from zapf.boekplan.nl ([5.39.185.232] helo=zapf.ntg.nl) by ciao.gmane.io with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1mkG49-00053q-7x for gctc-ntg-context-518@m.gmane-mx.org; Tue, 09 Nov 2021 02:36:49 +0100 Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id 4F2D6289036; Tue, 9 Nov 2021 02:36:14 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id F3jSoiafWqdd; Tue, 9 Nov 2021 02:36:11 +0100 (CET) Original-Received: from zapf.ntg.nl (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id D1EFE289038; Tue, 9 Nov 2021 02:36:10 +0100 (CET) Original-Received: from localhost (localhost [127.0.0.1]) by zapf.ntg.nl (Postfix) with ESMTP id D78A8289034 for ; Tue, 9 Nov 2021 02:36:08 +0100 (CET) X-Virus-Scanned: Debian amavisd-new at zapf.boekplan.nl Original-Received: from zapf.ntg.nl ([127.0.0.1]) by localhost (zapf.ntg.nl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id WpIuFO1bcwa8 for ; Tue, 9 Nov 2021 02:36:06 +0100 (CET) Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=209.85.208.178; helo=mail-lj1-f178.google.com; envelope-from=ramkumarkb@gmail.com; receiver= Original-Received: from mail-lj1-f178.google.com (mail-lj1-f178.google.com [209.85.208.178]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits)) (No client certificate requested) by zapf.ntg.nl (Postfix) with ESMTPS id C4144288DB8 for ; Tue, 9 Nov 2021 02:36:06 +0100 (CET) Original-Received: by mail-lj1-f178.google.com with SMTP id h11so33131291ljk.1 for ; Mon, 08 Nov 2021 17:36:06 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=InVmL4ebB8r4N0As4kFkJGWvqPdYn++OPf1606F/D2E=; b=IAXsvXDBt/FklpkyuBbNI110EdAG93nAYuSL1ApTWqZOf8R6vYovEM1xZ1MjF1YXR5 Vbk+Igbad/L/XwsBawSIkgSBWgFk7TpFlcp+wnsvx/Ym1gT+goRlmdUtn+ok73NDhBbW xxnKoLbhGvRaQ6pCCk9UrrBGjI4B2hWTcUogXh3zPyztkLm233fAa/Cw5JH+N7VV6uGb c1FBr/zxHfLeiuMa01rCFW7hl1+AODhW8geDwfTknhdMNhGq7oMLASpCUi8ewhh6tLo3 yWaNW1mJDpkfrmhD3yYANSjua8M7UDZGaKnOYMORDrUUnqLBP137FR+aosxyjrZ/tZNe OhPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=InVmL4ebB8r4N0As4kFkJGWvqPdYn++OPf1606F/D2E=; b=S3r1q6VBeBX8B8TRHAfp7lVlAtCnaaDAvWQ0OswvetpOzempIlhC/mbkCPm6b97hdj FlIl+RoHNIFUXrTS1sGs33swsGiCi9nW3dpYaa8LTx+w7vUHoRVJzimTwKvdoxvk+Y99 8jZ19Tcfb9iurcQMzbs7v10CT4soePvZoVBeLTZwAl268va9aXF8Sur07M0IBCV5YEp6 LsZdY07UhUBdjIMvfRifAg6utoFSVVh1Bnu6+gu2UJ3y/zeySxtrU29Z4YpwJaA3lkI4 tJhG89mwc5UUCwrSVqL6h/NPSCkTkcsjw/T/BBOHjGRxC5rjCfNDl6GnPGl1ftWwId2N TKGw== X-Gm-Message-State: AOAM533TiIRGVMhUaQwppduEF6AAephFhVO6HLNHQigO8dEfNnZF+ere TI1McsV0uaKrjS8ZkrJNfK8qIkRDchD1I78JNkip9Otp X-Google-Smtp-Source: ABdhPJwtQgMR4MIDa5qRn8aWeJaFqvOCQVmCQYUdYL/+k8oqp+EOJFO7P0pNhr53r0QP3qkQCgbcRatcNLl+qIetaw4= X-Received: by 2002:a05:651c:10a2:: with SMTP id k2mr3783324ljn.456.1636421765585; Mon, 08 Nov 2021 17:36:05 -0800 (PST) In-Reply-To: X-BeenThere: ntg-context@ntg.nl X-Mailman-Version: 2.1.26 Precedence: list List-Id: mailing list for ConTeXt users List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: ntg-context-bounces@ntg.nl Original-Sender: "ntg-context" Xref: news.gmane.io gmane.comp.tex.context:113340 Archived-At: --===============3528945465594479228== Content-Type: multipart/alternative; boundary="0000000000000a5d0e05d05122f7" --0000000000000a5d0e05d05122f7 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hans / Michal, Fascinating exchange of thoughts. Thank you so much for sharing. On the back of my mind, probably a bittersweet moment by Roblox - having built its foundations with Lua and deciding to fork / rewrite it... best regards, Ramkumar On Sun, Nov 7, 2021 at 2:39 AM Hans Hagen via ntg-context < ntg-context@ntg.nl> wrote: > On 11/6/2021 5:19 PM, Michal Vlas=C3=A1k wrote: > > On Fri Nov 5, 2021 at 9:14 PM CET, Hans Hagen via ntg-context wrote: > >> On 11/5/2021 6:23 PM, Ramkumar KB via ntg-context wrote: > >>> Hello, > >>> > >>> Yesterday, Roblox announced - Luau - https://luau-lang.org/why > >>> - mainly adding linting and > >>> type-checking features. > >>> > >>> Being compatible with Lua 5.1 is probably a bummer but nonetheless > >>> would be interesting to hear about this from this community. > > > >> for sure i need more than an email to give a real answer (and some can > >> be read between the lines of the history documents / articles that we > >> ship); that said: > >> > >> the main reasons for choosing lua for luatex has been that it is > >> relatively small, has no dependencies, doesn't need tons of libraries > >> to make it useful, is made for embeded usage, evolves in a proper > >> academic setting, has long-term dedicated (nice) developers, is not > >> part of some religious programming language war/competition, reminds > >> me (in a positive way of pascal and modula), is pretty fast, ... so, > >> no regrest and no need for something else > >> > >> [...] > >> > >> to start with typing: i suppose that a more explicit integer / float > >> separation can give better performance, although on modern cpu's one > >> can wonder (personally i don't see the current mix of integer / float > >> as a benefit over all numbers being floats - which had some charm due > >> to the consistency - but who an i to complain; at least we now have > >> bitwise operators (for a specific application like roblox it makes > >> sense but using a dedicated / patched / extended lua machinery in > >> luatex doesn't); there are articles by the lua authors about typing > >> but these are behind publisher firewalls > >> > >> [...] > >> > >> jitting also costs time and for a single pass process like tex there > >> is no gain (we established that long ago alreadY); the only reason why > >> luajittex is faster than luatex for a tex run is that the vm is faster > >> due to some limitations (that one can actually hit but in context we > >> got around it) ... jitting also is cpu dependent and therefore more > >> fragile futurw wise (more and more complex code too) > >> > >> [...] > >> > >> if better performance is an objective: there are probably spots in the > >> current code that are candidates and one can see from updates that > >> occasionally optimizations happen (keep in mind that lua has to run on > >> a wide range of hardware: small embedded to fast single core) > >> > >> so, I'm pretty okay with lua as it is now (but any influx from spin > >> off languages / engines can be interesting, but i think the authors > >> are aware of all that) ... and ... who knows what (side effects) > >> pallene will bring > >> > >> (also about performance: i know pretty well how to write fast lua code > >> but no one ever comes around asking so that means everyone is > >> satisfied) > >> > >> Hans > > > > After Ramkumar's initial e-mail, I reread some of the manuals describin= g > > Lua 5.1 / 5. 2 / 5.3 / 5.4 / LuaJIT evolution and evaluation. > > > > As I learned more about Lua and LuaTeX I realized that they share (or > > contrast in) some core concepts (e.g. TeX's hash table vs Lua tables, > > LuaTeX's sparse arrays vs Lua tables, custom allocation strategies - > > huge mem array and custom management vs garbage collection). > > > > Recently I discovered some of the things LuaJIT does (and it is in many > > ways incredible piece of software). > > > > So the idea of implementing LuaTeX in LuaJIT struck me. The reason why > > LuaJIT doesn't bring that many benefits for LuaTeX specifically (apart > > from the faster interpeter, is that LuaTeX heavily uses Lua C API (whic= h > > is AFAIK slow in LuaJIT since it can't (couldn't?)be JIT compiled and > > there is the overhead of the API itself - the stack nature). Wile FFI i= n > > LuaJIT is fast. And I don't necessarilly mean calling external C > > functions via FFI, just defining the structures (in C syntax) and using > > them transparently in LuaJIT (like "specialized and fast tables"). > > sure, it's a nice piece of software > > > I wonder how possible and usable would a LuaTeX implementation in pure > > (LuaJIT specific) Lua code would be, if it tried to offer the same API > > as currently described in the LuaTeX manual (hence being compatible). > > personally i would never gamble on that, just as i never gambled on > luajittex for the long run ... it's nice to have around as long as it > works but just as the ffilib used in luatex is 'abandoned by where it > came from', luajit is also stuck in 5.2 and there was even a moment that > it looked like being quit ... for me, anything that depends on low level > cpu specific code at compile time is not worth the effort (it's also why > i discarded libs in luametatex that have cpu specific optimizations that > then in turn demand running scripts to generate files for compilation > ... all not worth the trouble) > > now, keep in mind that (lua)jit involves some runtime analysis and that > is why we don't gain (we did quite some experiments at that time) > > also, often the runtime is not where one thinks (many jit performance > tests are doing math and we hardly do that); also in luatex we had to > patch the string hasher that came with luahit because it was tuned for > urls (think of skipping the first n chars i.e. http://) while for tex > that actually works out bad > > for the record: i have rewritten bits of core tex in lua but in the end > didn't see many benefits (i'll probably pick up that thread when > luametatex is kind of finished) .. i need to update it -) > > > I can see benefits in it being pure Lua (although with some optimized > > structures), most of the interesting things already happen in Lua and > > this would just extend the approachability and openness of the engine. > > as i mentioned, i will pick up that thread but still it will be via > callbacks ... much in tex is about macro handling (efficient in c) and > par building (efficient in c) ... crossing the c boundary is not that > costly in the end (one can sort of measure that) ... it's the cpu cache > (hits and misses) that matter more as lua and tex are jumping around > memory (not crunching numbers or massaging vectors) ... some gain will > come from the upcoming GB level 2 caches for cpu's (i guess) > > > Also the possibilities of having garbage collection (no need to worry > > about memory safety), JIT being viable (since there is no use of C API > > to prevent it), less platform dependence (AFAIK in some cases where PUC > > Lua uses the platform C's functions LuaJIT provides portable > > alternatives). > > jit is cpu dependent > > > There are also arguments against LuaJIT: > > - weird 5.1 / 5.2 mix (probably a matter of preference) > > and politics (one can find not so nice discussions on the web, one > reason for not using luajit btw) > > > - no integer types (but actually LuaJIT internally optimizes integers > > and also provides the bit library, but the surface is "clean double > > only") > > > > - requires certain unidiomatic coding style for achieving performance > > indeed, and this while ffi mix is kind of not-so-lua > > i get the feeling that it also stimulates inefficient code writing .. > the 'jit will do it for me' thing > > > - limited platform support (LuaJIT has to specifically be ported to > > each architecture, but the current support is pretty solid) > > > > - in the past total size of objects was limited to be 2 GiB (this is = no > > longer true with GC64 mode) > > also some limitations on what goes on the stack > > > - LuaTeX specifically has had problems with LuaJIT's hash function, I > > don't know the details though > > > > - while the code without C API use would be JITable, the benefits may > > not be large, since TeX runs are not that long, although there are > > critical parts of code that would certainly benefit > > an alternative could be the compilation of (stable) lua code into > modules (the lua folks have articles about that, and it seems to > outperform luajit) > > > Surely I somewhere forgot an important point for or against the > > theoretical idea. But Hans, I would still appreciate your general > > opinion, even though I remember some document saying that you already > > disregarded this possibility. > > one important point is that 'tex is also something knuthian' ... > software legacy ... nice to keep it around, running and up to date > > we can pick up that thread in a year or so (or at a meeting) > > Hans > > ps. about performance: it's not the core engine that is the bottleneck, > it's often suboptimal user styling and macro writing ... i'm often > really surprised how fast lua is, and when it's taking time it's often > for a reason (and yes, i spend a lot of time on benchmarking and > considering optimizations without messing up code, kind of fun thing) > > ----------------------------------------------------------------- > Hans Hagen | PRAGMA ADE > Ridderstraat 27 | 8061 GH Hasselt | The Netherlands > tel: 038 477 53 69 | www.pragma-ade.nl | www.pragma-pod.nl > ----------------------------------------------------------------- > > _________________________________________________________________________= __________ > If your question is of interest to others as well, please add an entry to > the Wiki! > > maillist : ntg-context@ntg.nl / > http://www.ntg.nl/mailman/listinfo/ntg-context > webpage : http://www.pragma-ade.nl / http://context.aanhet.net > archive : https://bitbucket.org/phg/context-mirror/commits/ > wiki : http://contextgarden.net > > _________________________________________________________________________= __________ > --0000000000000a5d0e05d05122f7 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hans / Michal,

Fascinating exchange of = thoughts. Thank you so=C2=A0much for sharing.

On t= he back of my mind, probably a bittersweet moment by Roblox - having=C2=A0b= uilt its foundations with Lua and deciding to fork / rewrite it...=C2=A0

best regards,
Ramkumar

On Sun, Nov 7,= 2021 at 2:39 AM Hans Hagen via ntg-context <ntg-context@ntg.nl> wrote:
On 11/6/2021 5:19 PM, Michal Vlas=C3=A1k wrote= :
> On Fri Nov 5, 2021 at 9:14 PM CET, Hans Hagen via ntg-context wrote: >> On 11/5/2021 6:23 PM, Ramkumar KB via ntg-context wrote:
>>> Hello,
>>>
>>> Yesterday, Roblox announced - Luau - https://luau-lang.org/why=
>>> <https://luau-lang.org/why> - mainly adding linting = and
>>> type-checking features.
>>>
>>> Being compatible with Lua 5.1 is probably a bummer but nonethe= less
>>> would be interesting to hear about this from this community. >
>> for sure i need more than an email to give a real answer (and some= can
>> be read between the lines of the history documents / articles that= we
>> ship); that said:
>>
>> the main reasons for choosing lua for luatex has been that it is >> relatively small, has no dependencies, doesn't need tons of li= braries
>> to make it useful, is made for embeded usage, evolves in a proper<= br> >> academic setting, has long-term dedicated (nice) developers, is no= t
>> part of some religious programming language war/competition, remin= ds
>> me (in a positive way of pascal and modula), is pretty fast, ... s= o,
>> no regrest and no need for something else
>>
>> [...]
>>
>> to start with typing: i suppose that a more explicit integer / flo= at
>> separation can give better performance, although on modern cpu'= ;s one
>> can wonder (personally i don't see the current mix of integer = / float
>> as a benefit over all numbers being floats - which had some charm = due
>> to the consistency - but who an i to complain; at least we now hav= e
>> bitwise operators (for a specific application like roblox it makes=
>> sense but using a dedicated / patched / extended lua machinery in<= br> >> luatex doesn't); there are articles by the lua authors about t= yping
>> but these are behind publisher firewalls
>>
>> [...]
>>
>> jitting also costs time and for a single pass process like tex the= re
>> is no gain (we established that long ago alreadY); the only reason= why
>> luajittex is faster than luatex for a tex run is that the vm is fa= ster
>> due to some limitations (that one can actually hit but in context = we
>> got around it) ... jitting also is cpu dependent and therefore mor= e
>> fragile futurw wise (more and more complex code too)
>>
>> [...]
>>
>> if better performance is an objective: there are probably spots in= the
>> current code that are candidates and one can see from updates that=
>> occasionally optimizations happen (keep in mind that lua has to ru= n on
>> a wide range of hardware: small embedded to fast single core)
>>
>> so, I'm pretty okay with lua as it is now (but any influx from= spin
>> off languages / engines can be interesting, but i think the author= s
>> are aware of all that) ... and ... who knows what (side effects) >> pallene will bring
>>
>> (also about performance: i know pretty well how to write fast lua = code
>> but no one ever comes around asking so that means everyone is
>> satisfied)
>>
>> Hans
>
> After Ramkumar's initial e-mail, I reread some of the manuals desc= ribing
> Lua 5.1 / 5. 2 / 5.3 / 5.4 / LuaJIT evolution and evaluation.
>
> As I learned more about Lua and LuaTeX I realized that they share (or<= br> > contrast in) some core concepts (e.g. TeX's hash table vs Lua tabl= es,
> LuaTeX's sparse arrays vs Lua tables, custom allocation strategies= -
> huge mem array and custom management vs garbage collection).
>
> Recently I discovered some of the things LuaJIT does (and it is in man= y
> ways incredible piece of software).
>
> So the idea of implementing LuaTeX in LuaJIT struck me. The reason why=
> LuaJIT doesn't bring that many benefits for LuaTeX specifically (a= part
> from the faster interpeter, is that LuaTeX heavily uses Lua C API (whi= ch
> is AFAIK slow in LuaJIT since it can't (couldn't?)be JIT compi= led and
> there is the overhead of the API itself - the stack nature). Wile FFI = in
> LuaJIT is fast. And I don't necessarilly mean calling external C > functions via FFI, just defining the structures (in C syntax) and usin= g
> them transparently in LuaJIT (like "specialized and fast tables&q= uot;).

sure, it's a nice piece of software

> I wonder how possible and usable would a LuaTeX implementation in pure=
> (LuaJIT specific) Lua code would be, if it tried to offer the same API=
> as currently described in the LuaTeX manual (hence being compatible).<= br>
personally i would never gamble on that, just as i never gambled on
luajittex for the long run ... it's nice to have around as long as it <= br> works but just as the ffilib used in luatex is 'abandoned by where it <= br> came from', luajit is also stuck in 5.2 and there was even a moment tha= t
it looked like being quit ... for me, anything that depends on low level cpu specific code at compile time is not worth the effort (it's also wh= y
i discarded libs in luametatex that have cpu specific optimizations that then in turn demand running scripts to generate files for compilation
... all not worth the trouble)

now, keep in mind that (lua)jit involves some runtime analysis and that is why we don't gain (we did quite some experiments at that time)

also, often the runtime is not where one thinks (many jit performance
tests are doing math and we hardly do that); also in luatex we had to
patch the string hasher that came with luahit because it was tuned for
urls (think of skipping the first n chars i.e. http://) while for tex
that actually works out bad

for the record: i have rewritten bits of core tex in lua but in the end didn't see many benefits (i'll probably pick up that thread when luametatex is kind of finished) .. i need to update it -)

> I can see benefits in it being pure Lua (although with some optimized<= br> > structures), most of the interesting things already happen in Lua and<= br> > this would just extend the approachability and openness of the engine.=

as i mentioned, i will pick up that thread but still it will be via
callbacks ... much in tex is about macro handling (efficient in c) and
par building (efficient in c) ... crossing the c boundary is not that
costly in the end (one can sort of measure that) ... it's the cpu cache=
(hits and misses) that matter more as lua and tex are jumping around
memory (not crunching numbers or massaging vectors) ... some gain will
come from the upcoming GB level 2 caches for cpu's (i guess)

> Also the possibilities of having garbage collection (no need to worry<= br> > about memory safety), JIT being viable (since there is no use of C API=
> to prevent it), less platform dependence (AFAIK in some cases where PU= C
> Lua uses the platform C's functions LuaJIT provides portable
> alternatives).

jit is cpu dependent

> There are also arguments against LuaJIT:
>=C2=A0 =C2=A0- weird 5.1 / 5.2 mix (probably a matter of preference)
and politics (one can find not so nice discussions on the web, one
reason for not using luajit btw)

>=C2=A0 =C2=A0- no integer types (but actually LuaJIT internally optimiz= es integers
>=C2=A0 =C2=A0 =C2=A0and also provides the bit library, but the surface = is "clean double
>=C2=A0 =C2=A0 =C2=A0only")
>
>=C2=A0 =C2=A0- requires certain unidiomatic coding style for achieving = performance

indeed, and this while ffi mix is kind of not-so-lua

i get the feeling that it also stimulates inefficient code writing ..
the 'jit will do it for me' thing

>=C2=A0 =C2=A0- limited platform support (LuaJIT has to specifically be = ported to
>=C2=A0 =C2=A0 =C2=A0each architecture, but the current support is prett= y solid)
>
>=C2=A0 =C2=A0- in the past total size of objects was limited to be 2 Gi= B (this is no
>=C2=A0 =C2=A0 =C2=A0longer true with GC64 mode)

also some limitations on what goes on the stack

>=C2=A0 =C2=A0- LuaTeX specifically has had problems with LuaJIT's h= ash function, I
>=C2=A0 =C2=A0 =C2=A0don't know the details though
>
>=C2=A0 =C2=A0- while the code without C API use would be JITable, the b= enefits may
>=C2=A0 =C2=A0 =C2=A0not be large, since TeX runs are not that long, alt= hough there are
>=C2=A0 =C2=A0 =C2=A0critical parts of code that would certainly benefit=

an alternative could be the compilation of (stable) lua code into
modules (the lua folks have articles about that, and it seems to
outperform luajit)

> Surely I somewhere forgot an important point for or against the
> theoretical idea. But Hans, I would still appreciate your general
> opinion, even though I remember some document saying that you already<= br> > disregarded this possibility.

one important point is that 'tex is also something knuthian' ... software legacy ... nice to keep it around, running and up to date

we can pick up that thread in a year or so (or at a meeting)

Hans

ps. about performance: it's not the core engine that is the bottleneck,=
it's often suboptimal user styling and macro writing ... i'm often =
really surprised how fast lua is, and when it's taking time it's of= ten
for a reason (and yes, i spend a lot of time on benchmarking and
considering optimizations without messing up code, kind of fun thing)

-----------------------------------------------------------------
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0Hans Hagen | PRAGMA ADE
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0Ridderstraat 27 | 80= 61 GH Hasselt | The Netherlands
=C2=A0 =C2=A0 =C2=A0 =C2=A0 tel: 038 477 53 69 | www.pragma-ade.nl | www.= pragma-pod.nl
-----------------------------------------------------------------
___________________________________________________________________________= ________
If your question is of interest to others as well, please add an entry to t= he Wiki!

maillist : ntg-cont= ext@ntg.nl / http://www.ntg.nl/mailman/listinfo/nt= g-context
webpage=C2=A0 : http://www.pragma-ade.nl / http://context.aanhet.net=
archive=C2=A0 : https://bitbucket.org/phg/context-m= irror/commits/
wiki=C2=A0 =C2=A0 =C2=A0: http://contextgarden.net
___________________________________________________________________________= ________
--0000000000000a5d0e05d05122f7-- --===============3528945465594479228== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Content-Disposition: inline X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KSWYgeW91ciBxdWVzdGlvbiBpcyBvZiBpbnRlcmVz dCB0byBvdGhlcnMgYXMgd2VsbCwgcGxlYXNlIGFkZCBhbiBlbnRyeSB0byB0aGUgV2lraSEKCm1h aWxsaXN0IDogbnRnLWNvbnRleHRAbnRnLm5sIC8gaHR0cDovL3d3dy5udGcubmwvbWFpbG1hbi9s aXN0aW5mby9udGctY29udGV4dAp3ZWJwYWdlICA6IGh0dHA6Ly93d3cucHJhZ21hLWFkZS5ubCAv IGh0dHA6Ly9jb250ZXh0LmFhbmhldC5uZXQKYXJjaGl2ZSAgOiBodHRwczovL2JpdGJ1Y2tldC5v cmcvcGhnL2NvbnRleHQtbWlycm9yL2NvbW1pdHMvCndpa2kgICAgIDogaHR0cDovL2NvbnRleHRn YXJkZW4ubmV0Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCg== --===============3528945465594479228==--