Return-path: Envelope-to: lojban-list-archive@lojban.org Delivery-date: Sun, 29 Aug 2021 07:13:15 -0700 Received: from mail-ej1-f60.google.com ([209.85.218.60]:42688) by stodi.digitalkingdom.org with esmtps (TLS1.3) tls TLS_AES_128_GCM_SHA256 (Exim 4.94) (envelope-from ) id 1mKLYd-003vy4-0X for lojban-list-archive@lojban.org; Sun, 29 Aug 2021 07:13:15 -0700 Received: by mail-ej1-f60.google.com with SMTP id x6-20020a170906710600b005c980192a39sf4615216ejj.9 for ; Sun, 29 Aug 2021 07:13:10 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1630246389; cv=pass; d=google.com; s=arc-20160816; b=Hi+X0iDS7lCx2awhKDXFgCstCekNMcdTmToYg8R+IagMga21vB2X38oBaWbTushp0y I+g/RBA+ggjPGG1ohIrUzeWQ/DIHKtH9EUx8dIsfFuYpGS2Yvthq2uhsOHM7xfMu9gLs sQ9vGooqvsLI1DXa1LPY2/l8Vq/fKHFhrrovCC0oFpYWdfT9uxVzmzce8KC3wwXuAH9q SzL0HpGFz1xHxgRIg/JLo6RSADiQelpVhUpLHWailO58Y1BAg8bFj/awS5vi0ctM70Nm Lm6N2EUaSfpKB8XV5ICjhyxIeQiSk7yQzA1x5WQRJB5RMFW4x8DloTxe57MOWh+Bx98W jcSA== ARC-Message-Signature: i=2; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-unsubscribe:list-subscribe:list-archive:list-help:list-post :list-id:mailing-list:precedence:reply-to:cc:to:subject:message-id :date:from:in-reply-to:references:mime-version:sender:dkim-signature :dkim-signature; bh=Pl72/mYowekhr1dIbINGxK82pin6UC2pjLXG++HIFt0=; b=blfDxGuaqFCyANmTxTAN3iU0axnWWFWoWLsl4jWWfjFox8d+YWetfk3G6uSQ1Sv6Yl m6eBA9bp0ZMYrSJSWZIgtDVepVznO7QoEOpZJIj+P4Q+D2BFKAxm07HIHHKcRgy4Z2AK 4rAi0kHL0vTo/aBF8yCEp6XnTuQFWh3NE0k3jf7uftnq7WR4i+AqusISYRzkltyob9SW 2LNWpEb2h8L4kYONYmUl+jhhbb2UZkrZqT8BTNvwzUVqhVngz0eZLQh2vOGi7QZW7uuh rhViRPEl/ynb2x4WAHNQqLRcOpFmYcusIRbfZWWiWYfRI4u8dpPFhMZFg+OUY4tk8s3l ZJyg== ARC-Authentication-Results: i=2; gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=aAwte7Lt; spf=pass (google.com: domain of shunpiker@gmail.com designates 2a00:1450:4864:20::631 as permitted sender) smtp.mailfrom=shunpiker@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20210112; h=sender:mime-version:references:in-reply-to:from:date:message-id :subject:to:cc:x-original-sender:x-original-authentication-results :reply-to:precedence:mailing-list:list-id:list-post:list-help :list-archive:list-subscribe:list-unsubscribe; bh=Pl72/mYowekhr1dIbINGxK82pin6UC2pjLXG++HIFt0=; b=rEhCcuA0IbcqLP/OHn6gn37mOQgxqiYMXbJb+ZtXQkM24U6f0Q5XV3Ljzc/UadNMyQ 5PDFFF0se/0Z/KpJvkJCkEcty5lcENSFkjnw/6L8AeAbuIv9aWfxhHt00HDiZo3Tm+iw c619cdg4VGOlETAhH+4vvQXpRi7X2aJwt+fseAkxvAB13BgNlUPmNIFaNJrSneCx592U 8qE+usDngLugUZZukkv4rCxqFZjGf7Oud+oFRrFgRBknpQO47dcmzlQStn7H/wThm+Ue a2JXmhgF74hUH+YVQllvhZY0d5B9SwOtFz20tHnhSrHgXLPYWJSr6qgjFCJscyXJP6ya EVug== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc:x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=Pl72/mYowekhr1dIbINGxK82pin6UC2pjLXG++HIFt0=; b=ZOyJdKOJaXaJ5+eQzFsLqw9SVHkt52k++53X18ZhpBlDKjz+xJthuVrOyun42bG43u 8WXlyC62rGeQURFJS9lH7CHhttPKjCTAPQDbciQPiQ9cpbS9XVl2nsKTxAD6G1VrFAgJ fpKLK5SCtMqR4fTK5i9U1UFYPDRpZU1SuSxmkMqoy30nw40TcukEpwmQ7vi3Nw7T3y5l ZYLy/xGKHkG/W3xYL//hWKA9qOusm7ctVKUdiXOM36zqq/2PkSva7BJHMIZyp0kbixFz 9s89hy8a1zo8PhLDblyHy8qpf1SL+xb8rIZ+pRBj3OTR08lIQFSDhCyusgJcKfUteJ+e 0gDw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=sender:x-gm-message-state:mime-version:references:in-reply-to:from :date:message-id:subject:to:cc:x-original-sender :x-original-authentication-results:reply-to:precedence:mailing-list :list-id:x-spam-checked-in-group:list-post:list-help:list-archive :list-subscribe:list-unsubscribe; bh=Pl72/mYowekhr1dIbINGxK82pin6UC2pjLXG++HIFt0=; b=itT3X8TUv4gBDho33qMupkrKPU4zoec0YxEA56CdyyHsgaY4Z4NNW0xyS9rnBf68Rh WINWu58d3MDhYNwh3ufUFq3u/nYXqLYVpq901dawauh0njb8Vcgk6nJmI4Vfxx5NGXIO 2TVPbVwAyxqV1HBkAUoXnQImnpn8plJR4JjeOM87K1m8ezMHC+XJ+y02cx2CuwiK/MGa onH8cMhBdhy5gTR6rUcEjxbapEXlg4NCTZLhJjnUO9HZaz1+0e8Ph7ulW/CtEXAxH8Z7 LdvfcOBhyA2q3SI4cr8EWEk1dDWzZAiCIMBaQaPwVSIJElBWC3pEfaygrDduH/gwmnjI OtyQ== Sender: lojban@googlegroups.com X-Gm-Message-State: AOAM532LbVF5ROmcYdHGCNBhs4bkE7rsDdSiaDa6mkXdM5UK9WyadUAr 73UR2FAmYr9Ls7h5wJPMclQ= X-Google-Smtp-Source: ABdhPJy+P3jn4pK4/CDRuX1oTzgjzK9Gb6H5Np2ki+fG2NWPYuaLb/4VlwcFprNpjok5ZklTzB5iLw== X-Received: by 2002:a05:6402:b9c:: with SMTP id cf28mr20201675edb.356.1630246389371; Sun, 29 Aug 2021 07:13:09 -0700 (PDT) X-BeenThere: lojban@googlegroups.com Received: by 2002:a17:906:d1d6:: with SMTP id bs22ls6676589ejb.3.gmail; Sun, 29 Aug 2021 07:13:08 -0700 (PDT) X-Received: by 2002:a17:906:318b:: with SMTP id 11mr20147257ejy.493.1630246388176; Sun, 29 Aug 2021 07:13:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1630246388; cv=none; d=google.com; s=arc-20160816; b=Qi4mkemNEC2AkYH1S/X30Y9c7sw3xhBp6yBDOTNZrHHtt33mXWRH1HKkP4TUB58PjK ZxVikGuHw57l7XG7qtuvkfdWI9iC19SZTDrFyZt3SJUqHIvk3U8GgZNtMCQqQqoya8/K kHmKwzZL9SzQBXd8XUDdbu7eFJ7lAy+/fzAd5u1X07HJ8Z4gw1EJQtTj1awS5MAgGuJC h1FwIilf3WpyTrOEuMOQtldDIEIPKUXbqq5cFtsoALh+qZ5ngYArdiHm5vaidu5cdMPj vwGTQMhV7CRcEgLFzkikAkleVu24LJmDESwcIN3C6nw52OucKmPQ5wUBHE93qNHgml+i GgLg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=HBhvr3eHwZKICu9Gz/FeCnXScsIA0sdlTXejmMRXr2k=; b=a3vnVUo4zcfwIgjdAS+PkKNfGw+ocuHue8St0g2z34UFztt9MaSLprc7CfgME0NcRm oZcD+pKMOHSXx6ep0dE2LQ7H3VUr73zbIDzGPBRXwnyNOWXxuILZBHab4h2pvgY3akML gj00/vtnQuR9O67R7P93tNd2oq9MEN6cIZBOMXtcCwhldPQ/jZDcm2g8Tq3lHWLui9aU vEvTDdsVHQMcg7W32YK7ulC+mgpz7VkjdQXSQIDrfWa3okkRdimSAwZ+ziC1H1Sy74yi bG/7k7a+lWqTIjtf6ebcuYclhe2B4eNLgTVFZ5O6TFpjj7k/sP/S3bd1yKCcQtICunSY Wt+g== ARC-Authentication-Results: i=1; gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=aAwte7Lt; spf=pass (google.com: domain of shunpiker@gmail.com designates 2a00:1450:4864:20::631 as permitted sender) smtp.mailfrom=shunpiker@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-ej1-x631.google.com (mail-ej1-x631.google.com. [2a00:1450:4864:20::631]) by gmr-mx.google.com with ESMTPS id s18si821459ejo.1.2021.08.29.07.13.08 for (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 29 Aug 2021 07:13:08 -0700 (PDT) Received-SPF: pass (google.com: domain of shunpiker@gmail.com designates 2a00:1450:4864:20::631 as permitted sender) client-ip=2a00:1450:4864:20::631; Received: by mail-ej1-x631.google.com with SMTP id me10so25105315ejb.11 for ; Sun, 29 Aug 2021 07:13:08 -0700 (PDT) X-Received: by 2002:a17:906:2dcf:: with SMTP id h15mr21203461eji.320.1630246387812; Sun, 29 Aug 2021 07:13:07 -0700 (PDT) MIME-Version: 1.0 References: <20210827021139.GO309000@gmail.com> <20210828040224.GS309000@gmail.com> In-Reply-To: <20210828040224.GS309000@gmail.com> From: Riley Lynch Date: Sun, 29 Aug 2021 10:12:56 -0400 Message-ID: Subject: [lojban] Re: Help parsing Lojban from Python? (Hey, Riley! :) To: Robin Lee Powell Cc: lojban@googlegroups.com Content-Type: multipart/alternative; boundary="000000000000d7920905cab35044" X-Original-Sender: shunpiker@gmail.com X-Original-Authentication-Results: gmr-mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=aAwte7Lt; spf=pass (google.com: domain of shunpiker@gmail.com designates 2a00:1450:4864:20::631 as permitted sender) smtp.mailfrom=shunpiker@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Reply-To: lojban@googlegroups.com Precedence: list Mailing-list: list lojban@googlegroups.com; contact lojban+owners@googlegroups.com List-ID: X-Spam-Checked-In-Group: lojban@googlegroups.com X-Google-Group-Id: 1004133512417 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , X-Spam-Score: -2.5 (--) X-Spam_score: -2.5 X-Spam_score_int: -24 X-Spam_bar: -- --000000000000d7920905cab35044 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable I'm going to be spending most of the day driving, but before I do that, I'll try to address a few questions here, and then can follow up by mail or IRC. (1) I want to confirm that camxes-py is the preferred Python option these days I'm not aware of other parsers in python. I specifically developed the parser because I wanted a python implementation to complement your java implementation and Masato and Ilmen's javascript parsers. I notice now that Randall Holmes has developed a Python PEG parser for Loglan. (2) I want to be able to run =E2=80=A6 it in a direct, straightforward way= =E2=80=A6 and tree should contain an obvious python representation of the parse tree (5) Make a mode that collapses productions with only one child Running will be the easy part. The representation of the parse tree raises some interesting questions. For camxes-py, I created a transformation of the parse tree which replicated the output of Ilmentufa. I did this so that I could run against the test corpus that you set up for java camxes and verify not only that the python parser could accept the same corpus as the java and javascript parsers, but that it was comprehending the same structures. That said, the output exposes a lot of the mechanics of the parser specification and obscures the semantics. Ideally, I'd like for the test suites to target compatibility with a semantically-structured representation of the parse. There's been some work on Ilmentufa to post-process the parse tree into something more palatable. Have you taken a look at that? (3) Update to most-recent parsimonious; it currently breaks on 0.8.1, but works on 0.6.2 I wrote against the most recent version of parsimonious at that time. Glad to see work has continued. I remember the author was working on some performance enhancements, and one problem with camxes-py in its current form is that it is slow. (4) Update to Python 3 I agree that this should be done. On Sat, Aug 28, 2021 at 12:02 AM Robin Lee Powell wrote: > Feel free to come find me on Libera IRC, or suggest a preferred chat > option for you. > > The stuff I want is actually quite simple, though: > > (1) I want to confirm that camxes-py is the preferred Python option > these days > > (2) I want to be able to run "run" (see > https://github.com/teleological/camxes-py/blob/master/camxes.py#L89 > ) or something like it in a direct, straightforward way, i.e.: > > import camxespy > tree =3D camxespy.run("mi klama", transformer=3D'camxes-morphol= ogy') > > , and tree should contain an obvious python representation of the > parse tree. > > This requires, AFAICT (I don't actually know Python very well) that > camxes-py have a library struture to it that it doesn't currently > have and that the options be configurable in some way other than > OptionParser. > > I can actually do all that myself, but I'm not really a pythonista > and what I do won't be idiomatic at all. > > Stretch goals: > > (3) Update to most-recent parsimonious; it currently breaks on > 0.8.1, but works on 0.6.2 > > (4) Update to Python 3, but I'm perfectly capable of making a PR for > this myself. > > (5) Make a mode that collapses productions with only one child, i.e. > make the output look like this (in terms of productions not syntax): > > rlpowell@stodi> echo "mi klama" | camxes -f > Flat layout requested. > text=3D( sentence=3D( CMAVO=3D( KOhA=3D( mi ) ) BRIVLA=3D( = gismu=3D( > klama ) ) ) ) > > Instead of this: > > root@66324b4aed4b:/src# python camxes.py "mi klama" > > ["text",["text_1",["paragraphs",["paragraph",["statement",["statement_1",= ["statement_2",["statement_3",["sentence",[["terms",["terms_1",["terms_2",[= "abs_term",["abs_term_1",["sumti",["sumti_1",["sumti_2",["sumti_3",["sumti_= 4",["sumti_5",["sumti_6",["KOhA_clause",[["KOhA","mi"]]]]]]]]]]]]]]],["CU"]= ],["bridi_tail",["bridi_tail_1",["bridi_tail_2",["bridi_tail_3",["selbri",[= "selbri_1",["selbri_2",["selbri_3",["selbri_4",["selbri_5",["selbri_6",["ta= nru_unit",["tanru_unit_1",["tanru_unit_2",["BRIVLA_clause",[["BRIVLA",["gis= mu","klama"]]]]]]]]]]]]]],["tail_terms",["VAU"]]]]]]]]]]]]]]] > > , but as I said before this is not hard to do after the fact once > you have the parse tree. > > > On Fri, Aug 27, 2021 at 11:15:54PM -0400, Riley Martinez-Lynch > wrote: > > Robin, I'd be happy to make whatever changes are needed to make it > > work. I don't see the CLI interface as an essential part of the > > interface, and if I can do something to make it easier to access > > programmatically, I'd like to do that. Glad to take cues here, or > > if you wanted to jump on a call or chat, can do that too. > > > > Sent from my iPhone > > > > > On Aug 26, 2021, at 10:11 PM, Robin Lee Powell < > robinleepowell@gmail.com> wrote: > > > > > > =EF=BB=BF > > > In service to making certain parts of the lojban.org infra a bit > > > more resilient, I'm updating some stuff that uses > > > https://github.com/lojban/python-camxes . This relies on java and > > > the camxes jar, which, whatever, but it's also built on LEPL, which > > > no longer works (see for example > > > https://github.com/modoboa/modoboa/issues/1780 ). > > > > > > https://github.com/teleological/camxes-py is a pure Python > > > replacement, but is a CLI program rather than a library; it's really > > > not designed to be used as a library. I'd love it if someone > > > updated and fixed that. > > > > > > Unless there's another option? What's the state of the art in this > > > space? > > > > --=20 You received this message because you are subscribed to the Google Groups "= lojban" group. To unsubscribe from this group and stop receiving emails from it, send an e= mail to lojban+unsubscribe@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/= lojban/CAB-HkawLxFuQZT8_vuZf8wmudq%3DkBkY%3Dy5yC%3DOWom2fNyvQANw%40mail.gma= il.com. --000000000000d7920905cab35044 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
I'm going to be spending most of the day driving,= but before I do that, I'll try to address a few questions here, and th= en can follow up by mail or IRC.

(1) I want to confirm that c= amxes-py is the preferred Python option
these days

I'm not aware of other parsers in python. I specifically develo= ped the parser because I wanted a python implementation to complement your = java implementation and Masato and Ilmen's javascript parsers.

I notice now that Randall Holmes has developed a Python PE= G parser for Loglan.

(2) I want to be able to run = =E2=80=A6=C2=A0=C2=A0it = in a direct, straightforward way =E2=80=A6 and tree should contain an obvio= us python representation of the
parse tree
(5) Make a mode tha= t collapses productions with only one child

Running = will be the easy part. The representation of the parse tree raises some int= eresting questions.

For camxes-py, I created a tra= nsformation of the parse tree which replicated the output of Ilmentufa. I d= id this so that I could run against the test corpus=C2=A0that you set up fo= r java camxes=C2=A0and verify not only that the python parser could accept = the same corpus as the java and javascript parsers, but that it was compreh= ending the same structures.

That said, the output = exposes a lot of the mechanics of the parser specification and obscures the= semantics. Ideally, I'd like for the test suites to target compatibili= ty with a semantically-structured representation of the parse. There's = been some work on Ilmentufa to post-process the parse tree into something m= ore palatable. Have you taken a look at that?

(3) = Update to most-recent parsimonious; it currently breaks on=C2=A00.8.1, but = works on 0.6.2

I wrote against the most recent= version of parsimonious at that time. Glad to see work has continued. I re= member the author was working on some performance enhancements, and one pro= blem with camxes-py in its current form is that it is slow.

<= /div>
(4) Update to Python 3

I agree that = this should be done.


On Sat, Aug 28, 2021 at 12:0= 2 AM Robin Lee Powell <robin= leepowell@gmail.com> wrote:
Feel free to c= ome find me on Libera IRC, or suggest a preferred chat
option for you.

The stuff I want is actually quite simple, though:

(1) I want to confirm that camxes-py is the preferred Python option
these days

(2) I want to be able to run "run" (see
https://github.com/teleological/c= amxes-py/blob/master/camxes.py#L89
) or something like it in a direct, straightforward way, i.e.:

=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 import camxespy
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 tree =3D camxespy.run("mi klama&quo= t;, transformer=3D'camxes-morphology')

, and tree should contain an obvious python representation of the
parse tree.

This requires, AFAICT (I don't actually know Python very well) that
camxes-py have a library struture to it that it doesn't currently
have and that the options be configurable in some way other than
OptionParser.

I can actually do all that myself, but I'm not really a pythonista
and what I do won't be idiomatic at all.

Stretch goals:

(3) Update to most-recent parsimonious; it currently breaks on
0.8.1, but works on 0.6.2

(4) Update to Python 3, but I'm perfectly capable of making a PR for this myself.

(5) Make a mode that collapses productions with only one child, i.e.
make the output look like this (in terms of productions not syntax):

=C2=A0 =C2=A0 =C2=A0 =C2=A0 rlpowell@stodi> echo "mi klama" | = camxes -f
=C2=A0 =C2=A0 =C2=A0 =C2=A0 Flat layout requested.
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0text=3D(=C2=A0 sentence=3D(=C2=A0 CMAVO= =3D(=C2=A0 KOhA=3D( mi )=C2=A0 )=C2=A0 BRIVLA=3D(=C2=A0 gismu=3D( klama )= =C2=A0 )=C2=A0 )=C2=A0 )

Instead of this:

root@66324b4aed4b:/src# python camxes.py "mi klama"
["text",["text_1",["paragraphs",["paragr= aph",["statement",["statement_1",["statement_= 2",["statement_3",["sentence",[["terms",= ["terms_1",["terms_2",["abs_term",["abs_= term_1",["sumti",["sumti_1",["sumti_2",[= "sumti_3",["sumti_4",["sumti_5",["sumti_= 6",["KOhA_clause",[["KOhA","mi"]]]]]]]]]= ]]]]]],["CU"]],["bridi_tail",["bridi_tail_1",= ["bridi_tail_2",["bridi_tail_3",["selbri",[&q= uot;selbri_1",["selbri_2",["selbri_3",["selbr= i_4",["selbri_5",["selbri_6",["tanru_unit&quo= t;,["tanru_unit_1",["tanru_unit_2",["BRIVLA_clause= ",[["BRIVLA",["gismu","klama"]]]]]]]]]]]= ]]],["tail_terms",["VAU"]]]]]]]]]]]]]]]

, but as I said before this is not hard to do after the fact once
you have the parse tree.


On Fri, Aug 27, 2021 at 11:15:54PM -0400, Riley Martinez-Lynch
wrote:
> Robin, I'd be happy to make whatever changes are needed to make it=
> work. I don't see the CLI interface as an essential part of the > interface, and if I can do something to make it easier to access
> programmatically, I'd like to do that. Glad to take cues here, or<= br> > if you wanted to jump on a call or chat, can do that too.
>
> Sent from my iPhone
>
> > On Aug 26, 2021, at 10:11 PM, Robin Lee Powell <robinleepowell@gmail.com> wrote:
> >
> > =EF=BB=BF
> > In service to making certain parts of the
lojban.org infra a bit
> > more resilient, I'm updating some stuff that uses
> > https://github.com/lojban/python-camxes .=C2=A0= This relies on java and
> > the camxes jar, which, whatever, but it's also built on LEPL,= which
> > no longer works (see for example
> > https://github.com/modoboa/modoboa/issues/17= 80 ).
> >
> > https://github.com/teleological/camxes-py is = a pure Python
> > replacement, but is a CLI program rather than a library; it's= really
> > not designed to be used as a library.=C2=A0 I'd love it if so= meone
> > updated and fixed that.
> >
> > Unless there's another option?=C2=A0 What's the state of = the art in this
> > space?
> >

--
You received this message because you are subscribed to the Google Groups &= quot;lojban" group.
To unsubscribe from this group and stop receiving emails from it, send an e= mail to lojban+unsub= scribe@googlegroups.com.
To view this discussion on the web visit https://groups.go= ogle.com/d/msgid/lojban/CAB-HkawLxFuQZT8_vuZf8wmudq%3DkBkY%3Dy5yC%3DOWom2fN= yvQANw%40mail.gmail.com.
--000000000000d7920905cab35044--