> Confirmed in even a better way: given how convoluted and hacky is
> writing a full Python Parser, it is probably not even a Context Free > Grammar. Let's agree on the fact that you'll be able to parse it using Context Sensitive Grammar (Type 1) for sure ... and if you're very lucky Context Free (Type 2) might be sufficient but PITA to write and maintain. Agreed? :-) CU, Udo On 23.09.14 14:20, Thierry Goubier wrote: > > > 2014-09-23 13:57 GMT+02:00 Udo Schneider <[hidden email] > <mailto:[hidden email]>>: > > > yeap noway I compare Regex with PettitParser. I will probably give a > > PettitParser a try, because I try to parse Pharo syntax to Python, I > > want now to parse Pharo classes to python class and that will be a > > nightmare with regex, so time to give PettitParser a serious try. > Without wanting to go too deep into theory... Parsing Pharo or > Python would definitely need a Chromsky Type 2 language (Context > free grammar). So you'd be out of luck parsing Smalltalk or Python > code with Regular Expressions (Chromsky Type 3) only - except maybe > for some very simple expressions. > > > Confirmed in even a better way: given how convoluted and hacky is > writing a full Python Parser, it is probably not even a Context Free > Grammar. > > That is: the Python grammar is LALR which is a subset of Context Free > Grammar (but already more than a type 3 Chomsky grammar), but the Lexer > is a fair bit more than usual (dedent tokens come to mind; special > handling of end of lines as well). > > I think you need a fair bit of special magic in PetitParser to parse Python. > > Luckily, Python is well documented in that regard. > > Thierry > > > CU, > > Udo > > > On 23.09.14 13:35, kilon alios wrote: > > yeap noway I compare Regex with PettitParser. I will probably give a > PettitParser a try, because I try to parse Pharo syntax to Python, I > want now to parse Pharo classes to python class and that will be a > nightmare with regex, so time to give PettitParser a serious try. > > On Tue, Sep 23, 2014 at 1:10 PM, Udo Schneider > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>>> > wrote: > > > I have not used PettitParser yet, looks powerful but I > find it a bit > > weird in design. On the other hand regex is quite ugly > and understanding > > complex regex a pain. > I normally encounter two issues with RegExps: > > 1) The syntax between different apps/libs/frameworks differs > sligtly. Esp. for character classes or greediness. This > drove me > crazy more than one time. > 2) Often enough I realize (while developing the RegExp) > that I need > something more capable than a Chomsky Type 3 parser (which > RegExps > are in a way). So I have to use "a bigger gun" - e.g. > PetitParser. > > CU, > > Udo > > > On 23.09.14 10:15, kilon alios wrote: > > it reminds a lot of Kent's Beck Smalltalk Practice > Patterns where it > removes all ifs and replaces them with regular unary > messages . > It is > definitely an elegant way of coding making the code > just flow. > > I have not used PettitParser yet, looks powerful but I > find it a bit > weird in design. On the other hand regex is quite ugly and > understanding > complex regex a pain. > > On Tue, Sep 23, 2014 at 11:07 AM, Udo Schneider > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>> > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>>> > wrote: > > > just as it is black magic for me now :D > The nice thing about this approach is the fact > that it "just" > piggybacks the normal Smalltalk message sending. > So you can > step > through it using the Debugger - it's Smalltalk all > the way > down. > > I still remember my first shock when (having no formal > background on > parsing theory at that time) I saw the parsing tables > generated by > T-Gen. Of course it was Smalltalk ... but > understanding > those tables > was a nightmare. > > PetitParser is the gold standard here IMHO. It is > able to parse > arbitrary input (compared to my block expressions > only). > And you can > still use the Debugger to step through the parsing > process *and > still understand what's going on!* > > CU, > > Udo > > On 23.09.14 09:54, kilon alios wrote: > > just as it is black magic for me now :D > > At least I get the general feeling. I am new > to parsing > too, so > far I > have only played with regex parsing. Not the most > smalltalkish > way but > it works well so far. > > On Tue, Sep 23, 2014 at 9:39 AM, Udo Schneider > > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>> > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>> > <mailto:udo.schneider@ <mailto:udo.schneider@> > <mailto:udo.schneider@ > <mailto:udo.schneider@>>__homea__d__dress.de > <http://homead__dress.de> <http://homeaddress.de> > > > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>>>> > wrote: > > Hi Estaban, > > I think the first time I saw this pattern > was in > ReStore on > Dolphin > Smalltalk. I didn't understand it's > implementation > back then. I > assume that it's similar to what I described > though. But > having a > Smalltalk block automagically creating the > equivalent SQL > SELECT > expression was like black magic at that > time :-) > > CU, > > Udo > > > > > On 23.09.14 04:15, Esteban A. Maringolo > wrote: > > Excellent article. > > I think GLORP uses a similar technique to > setup its > expressions, and > also have issues with #and:/#or: > selectors due to > inlining, so > it uses > AND:/#OR: instead. > > Regards! > > Esteban A. Maringolo > > pd: Your blog and it's choosen topic > made me > remember > http://use-the-index-luke.com/ > > 2014-09-22 20:48 GMT-03:00 Udo Schneider > > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>> > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>> > <mailto:udo.schneider@ > <mailto:udo.schneider@> > <mailto:udo.schneider@ > <mailto:udo.schneider@>>__homea__d__dress.de > <http://homead__dress.de> <http://homeaddress.de> > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>>>>__: > > > All, > > I just finished a blog entry. It > shows how > to use > Smalltalk > blocks as parsers/translators. E.g. > translating a Block > > [:customer | (customer > joinDate > year is: Date > today year)] > > into an SQL-like String > > > (YEAR(customers.joinDate) = 2014) > > The SQL stuff is just an example > - you can > create > nearly any > output. > > Check out > http://readthesourceluke.__blo______gspot.de/2014/09/block-________translators-parsing-magic.__html > <http://blo____gspot.de/2014/09/block-______translators-parsing-magic.html> > > <http://blo__gspot.de/2014/09/__block-____translators-parsing-__magic.html > <http://blo__gspot.de/2014/09/block-____translators-parsing-magic.html>> > > > <http://blogspot.de/2014/09/____block-__translators-parsing-____magic.html > <http://blogspot.de/2014/09/__block-__translators-parsing-__magic.html> > > <http://blogspot.de/2014/09/__block-__translators-parsing-__magic.html > <http://blogspot.de/2014/09/block-__translators-parsing-magic.html>>> > > > > <http://readthesourceluke.__bl____ogspot.de/2014/09/block-______translators-parsing-magic.html > <http://bl__ogspot.de/2014/09/block-____translators-parsing-magic.html> > > <http://blogspot.de/2014/09/__block-__translators-parsing-__magic.html > <http://blogspot.de/2014/09/block-__translators-parsing-magic.html>> > > > <http://readthesourceluke.__bl__ogspot.de/2014/09/block-____translators-parsing-magic.html > <http://blogspot.de/2014/09/block-__translators-parsing-magic.html> > > <http://readthesourceluke.__blogspot.de/2014/09/block-__translators-parsing-magic.html > <http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html>__>__>__> > > Maybe that's old stuff for some > of you - > but I hope > it's > interesting for some at least :-) > > Comments and feedback appreciated. > > CU, > > Udo > > > > > > > > > > > > > > > > > > > > |
In reply to this post by Udo Schneider
Hi Udo,
This is really an excellent article: I enjoyed reading it a lot. It is well written, has lots of relevant code examples and a nice pace, but above all it is really interesting. Thanks a lot. Keep that kind of stuff coming, it is very helpful. Sven On 23 Sep 2014, at 01:48, Udo Schneider <[hidden email]> wrote: > All, > > I just finished a blog entry. It shows how to use Smalltalk blocks as parsers/translators. E.g. translating a Block > > [:customer | (customer joinDate year is: Date today year)] > > into an SQL-like String > > (YEAR(customers.joinDate) = 2014) > > The SQL stuff is just an example - you can create nearly any output. > > Check out http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html > > Maybe that's old stuff for some of you - but I hope it's interesting for some at least :-) > > Comments and feedback appreciated. > > CU, > > Udo > > |
In reply to this post by philippeback
Phil,
If I remember correctly one of Andres Valloud's books has some more information on Boolean (logic) and Smalltalk. I think it was "A Mentoring Course on Smalltalk" [1]. Definitely worth a read!! CU, Udo [1] http://www.lulu.com/shop/andres-valloud/a-mentoring-course-on-smalltalk/paperback/product-3788890.html On 23.09.14 13:57, [hidden email] wrote: > Thx for this! > > I'd say that the material is worthy of inclusion into a bool chapter. > > Phil > > Le 23 sept. 2014 12:51, "Udo Schneider" <[hidden email] > <mailto:[hidden email]>> a écrit : > > Phil, > > I'd say that's an implementation of the "Material implication"[1] > operator from Propositional calculus. > > You can write it as > > P -> Q > > and read it as "P implies Q" or (not 100% correct) "if P (is true) > then Q (is true)". > > Let's take a look at the truth table: > > P | Q | P -> Q > ---+---+------- > t | t | t > ---+---+------- > > inserting it into the statement above yields: > > "if true then true" which is true indeed. > > The funny thing starts when we look at the case(s), where P is > false. The general (verbal) rule says that if the premise (P) is > false the truth value of the conclusion doesn't matter. Hence the > complete term is true: > > P | Q | P -> Q > ---+---+------- > f | t | t > ---+---+------- > f | f | t > ---+---+------- > > There is one case left: What happens if the premise is true but the > conclusion is false? That's in direct violation of the defintion > which states that "if P (is true) then Q (is true)". As P is true > and Q is false the truth value of the complete term is false! > > P | Q | P -> Q > ---+---+------- > t | f | f > ---+---+------- > > Or to put it in different words: An implication can only be false if > the premise is true but the conclusion is false. > > So we end up with this truth table: > > P | Q | P -> Q > ---+---+------- > t | t | t > ---+---+------- > f | t | t > ---+---+------- > f | f | t > ---+---+------- > t | f | f > ---+---+------- > > We did not take a look yet, at how to implement this with basic > boolean operators. So we need to take a look at the table and find > the expression: Let's start with the exception (fourth case). We can > express this as: > > !(P & !Q) -> "The term is false if P is true and Q is false" > > I added the inner term "P & !Q" to the table to make it easier to > follow: > > > P | Q | P -> Q | P & !Q | !(P & !Q) > ---+---+--------+--------+----__------- > t | t | t | f | t > ---+---+--------+--------+----__------- > f | t | t | t | f > ---+---+--------+--------+----__------- > f | f | t | f | t > ---+---+--------+--------+----__------- > t | f | f | f | t > ---+---+--------+--------+----__------- > > The "last" step is to simplify the term "!(P & !Q)" using one of de > Morgan's laws: > !(A & B) == !A | !B > > Using this for our term gives > > !(P & !Q) == !P | !!Q == !P | Q > > P | Q | P -> Q | P & !Q | !(P & !Q) | !P | Q > ---+---+--------+--------+----__-------+-------- > t | t | t | f | t | t > ---+---+--------+--------+----__-------+-------- > f | t | t | t | f | f > ---+---+--------+--------+----__-------+-------- > f | f | t | f | t | t > ---+---+--------+--------+----__-------+-------- > t | f | f | f | t | t > ---+---+--------+--------+----__-------+-------- > > So our final term is "correct" (proof in the truth table) and is > equivalent to the smalltalk term: > > !P | Q := self not or: [aBlock value] > > > I have to admit though that implications in Propositional calculus > really gave me a headache. You might simply want to accept that they > are defined this way. And maybe it doesn't help ... but there are > even more strange things lurking around the corner [4] :-) > > Although not immidiatly obvious all the terms in Propositional > calculus do not neccessarly have a semantic meaning in context to > each other. They are totaly independent. The only thing that counts > is the truth value of its terms. E.g. something like this is > mathematically/syntacically valid but doesn't make any sense from a > semantic point of view: > > P := I am 12y old > Q := It rains > > The term "P -> Q" is perfectly fine mathematically/syntacically but > doesn't mean anything in terms of semantics. > > > Hope this helps. > > CU, > > Udo > > > [1] > http://en.wikipedia.org/wiki/__Material_implication_(rule_of___inference) > <http://en.wikipedia.org/wiki/Material_implication_(rule_of_inference)> > [2] http://en.wikipedia.org/wiki/__Propositional_calculus > <http://en.wikipedia.org/wiki/Propositional_calculus> > [3] http://en.wikipedia.org/wiki/__De_Morgan's_laws > <http://en.wikipedia.org/wiki/De_Morgan's_laws> > [4] > http://en.wikipedia.org/wiki/__Paradoxes_of_material___implication > <http://en.wikipedia.org/wiki/Paradoxes_of_material_implication> > > On 23.09.14 10:49, [hidden email] > <mailto:[hidden email]> wrote: > > Cool article & technique indeed. Ah Smalltalk, where were you > all those > years ;-) > > Speaking of PetitParser, which is excellent indeed, there is > this #==> > method in Boolean. > > PetitParser uses that a lot. I can use the thing but do not really > grasps how it works. > > Now, the method comment says: > > Boolean #==> aBlock > "The material conditional, also known as the material implication or > truth functional conditional.Correspond to not ... or ... and > does not > correspond to the English if...then... construction. > known as: > b if a > a implies b > if a then b > b is a consequence of a > a therefore b (but note: 'it is raining therefore it is cloudy' is > implication; 'it is autumn therefore the leaves are falling' is > equivalence). > Here is the truth table for material implication: > p | q | p ==> q > -------|-------|------------- > T | T | T > T | F | F > F | T | T > F | F | T > " > > ^self not or: [aBlock value] > > > This is still a bit foggy to me. > > Anyone caring to shed some light on that? > What are the typical ways to use that? > > TIA > Phil > > > > > On Tue, Sep 23, 2014 at 10:07 AM, Udo Schneider > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>>> > wrote: > > > just as it is black magic for me now :D > The nice thing about this approach is the fact that it "just" > piggybacks the normal Smalltalk message sending. So you can > step > through it using the Debugger - it's Smalltalk all the way > down. > > I still remember my first shock when (having no formal > background on > parsing theory at that time) I saw the parsing tables > generated by > T-Gen. Of course it was Smalltalk ... but understanding > those tables > was a nightmare. > > PetitParser is the gold standard here IMHO. It is able to parse > arbitrary input (compared to my block expressions only). > And you can > still use the Debugger to step through the parsing process *and > still understand what's going on!* > > CU, > > Udo > > On 23.09.14 09:54, kilon alios wrote: > > just as it is black magic for me now :D > > At least I get the general feeling. I am new to parsing > too, so > far I > have only played with regex parsing. Not the most > smalltalkish > way but > it works well so far. > > On Tue, Sep 23, 2014 at 9:39 AM, Udo Schneider > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>> > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>>> > wrote: > > Hi Estaban, > > I think the first time I saw this pattern was in > ReStore on > Dolphin > Smalltalk. I didn't understand it's implementation > back then. I > assume that it's similar to what I described > though. But > having a > Smalltalk block automagically creating the > equivalent SQL > SELECT > expression was like black magic at that time :-) > > CU, > > Udo > > > > > On 23.09.14 04:15, Esteban A. Maringolo wrote: > > Excellent article. > > I think GLORP uses a similar technique to > setup its > expressions, and > also have issues with #and:/#or: selectors due to > inlining, so > it uses > AND:/#OR: instead. > > Regards! > > Esteban A. Maringolo > > pd: Your blog and it's choosen topic made me > remember > http://use-the-index-luke.com/ > > 2014-09-22 20:48 GMT-03:00 Udo Schneider > <[hidden email] > <mailto:[hidden email]> > <mailto:[hidden email] > <mailto:[hidden email]>> > <mailto:udo.schneider@ > <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> > <mailto:[hidden email] > <mailto:[hidden email]>>>>__: > > > All, > > I just finished a blog entry. It shows how > to use > Smalltalk > blocks as parsers/translators. E.g. > translating a Block > > [:customer | (customer joinDate > year is: Date > today year)] > > into an SQL-like String > > (YEAR(customers.joinDate) = 2014) > > The SQL stuff is just an example - you can > create > nearly any > output. > > Check out > http://readthesourceluke.__blo____gspot.de/2014/09/block-______translators-parsing-magic.html > <http://blo__gspot.de/2014/09/block-____translators-parsing-magic.html> > > <http://blogspot.de/2014/09/__block-__translators-parsing-__magic.html > <http://blogspot.de/2014/09/block-__translators-parsing-magic.html>> > > > <http://readthesourceluke.__bl__ogspot.de/2014/09/block-____translators-parsing-magic.html > <http://blogspot.de/2014/09/block-__translators-parsing-magic.html> > > <http://readthesourceluke.__blogspot.de/2014/09/block-__translators-parsing-magic.html > <http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html>__>__> > > Maybe that's old stuff for some of you - > but I hope > it's > interesting for some at least :-) > > Comments and feedback appreciated. > > CU, > > Udo > > > > > > > > > > > > > > > > > |
In reply to this post by Udo Schneider
2014-09-23 15:57 GMT+02:00 Udo Schneider <[hidden email]>: > Confirmed in even a better way: given how convoluted and hacky is Agreed :) Thierry Â
|
In reply to this post by Thierry Goubier
> I reviewed a few techniques for implementing internal / embeddel DSLs in
> a host language and I didn't saw this one :) IMHO it's a nice tool to know about. Only for specific use cases but still useful. CU, Udo On 23.09.14 09:06, Thierry Goubier wrote: > Thanks Udo; > > I reviewed a few techniques for implementing internal / embeddel DSLs in > a host language and I didn't saw this one :) > > Thierry > > 2014-09-23 1:48 GMT+02:00 Udo Schneider > <[hidden email] > <mailto:[hidden email]>>: > > All, > > I just finished a blog entry. It shows how to use Smalltalk blocks > as parsers/translators. E.g. translating a Block > > [:customer | (customer joinDate year is: Date today year)] > > into an SQL-like String > > (YEAR(customers.joinDate) = 2014) > > The SQL stuff is just an example - you can create nearly any output. > > Check out > http://readthesourceluke.__blogspot.de/2014/09/block-__translators-parsing-magic.html > <http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html> > > Maybe that's old stuff for some of you - but I hope it's interesting > for some at least :-) > > Comments and feedback appreciated. > > CU, > > Udo > > > |
In reply to this post by Sven Van Caekenberghe-2
Hi Sven,
thanks for the feedback. > Keep that kind of stuff coming, it is very helpful. I'll try to. It just always takes so long to write stuff. But I think you know that, don't you? :-) CU, Udo On 23.09.14 16:00, Sven Van Caekenberghe wrote: > Hi Udo, > > This is really an excellent article: I enjoyed reading it a lot. > > It is well written, has lots of relevant code examples and a nice pace, but above all it is really interesting. > > Thanks a lot. > > Keep that kind of stuff coming, it is very helpful. > > Sven > > On 23 Sep 2014, at 01:48, Udo Schneider <[hidden email]> wrote: > >> All, >> >> I just finished a blog entry. It shows how to use Smalltalk blocks as parsers/translators. E.g. translating a Block >> >> [:customer | (customer joinDate year is: Date today year)] >> >> into an SQL-like String >> >> (YEAR(customers.joinDate) = 2014) >> >> The SQL stuff is just an example - you can create nearly any output. >> >> Check out http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html >> >> Maybe that's old stuff for some of you - but I hope it's interesting for some at least :-) >> >> Comments and feedback appreciated. >> >> CU, >> >> Udo >> >> > > > |
On 23 Sep 2014, at 21:00, Udo Schneider <[hidden email]> wrote: > Hi Sven, > > thanks for the feedback. > > > Keep that kind of stuff coming, it is very helpful. > I'll try to. It just always takes so long to write stuff. But I think you know that, don't you? :-) Yes I do, but you also know (it was clear from the article) that you learn a lot yourself from writing something for public consumption. Most people underestimate how powerful that is. > CU, > > Udo > > On 23.09.14 16:00, Sven Van Caekenberghe wrote: >> Hi Udo, >> >> This is really an excellent article: I enjoyed reading it a lot. >> >> It is well written, has lots of relevant code examples and a nice pace, but above all it is really interesting. >> >> Thanks a lot. >> >> Keep that kind of stuff coming, it is very helpful. >> >> Sven >> >> On 23 Sep 2014, at 01:48, Udo Schneider <[hidden email]> wrote: >> >>> All, >>> >>> I just finished a blog entry. It shows how to use Smalltalk blocks as parsers/translators. E.g. translating a Block >>> >>> [:customer | (customer joinDate year is: Date today year)] >>> >>> into an SQL-like String >>> >>> (YEAR(customers.joinDate) = 2014) >>> >>> The SQL stuff is just an example - you can create nearly any output. >>> >>> Check out http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html >>> >>> Maybe that's old stuff for some of you - but I hope it's interesting for some at least :-) >>> >>> Comments and feedback appreciated. >>> >>> CU, >>> >>> Udo >>> >>> >> >> >> > > > |
> Yes I do, but you also know (it was clear from the article) that you
> learn a lot yourself from writing something for public consumption. > Most people underestimate how powerful that is. True indeed - sorting my thoughts to be able to write them down in a coherent way for public consumption really forces me to understand the stuff pretty deeply. CU, Udo On 23.09.14 21:11, Sven Van Caekenberghe wrote: > > On 23 Sep 2014, at 21:00, Udo Schneider <[hidden email]> wrote: > >> Hi Sven, >> >> thanks for the feedback. >> >>> Keep that kind of stuff coming, it is very helpful. >> I'll try to. It just always takes so long to write stuff. But I think you know that, don't you? :-) > > Yes I do, but you also know (it was clear from the article) that you learn a lot yourself from writing something for public consumption. Most people underestimate how powerful that is. > >> CU, >> >> Udo >> >> On 23.09.14 16:00, Sven Van Caekenberghe wrote: >>> Hi Udo, >>> >>> This is really an excellent article: I enjoyed reading it a lot. >>> >>> It is well written, has lots of relevant code examples and a nice pace, but above all it is really interesting. >>> >>> Thanks a lot. >>> >>> Keep that kind of stuff coming, it is very helpful. >>> >>> Sven >>> >>> On 23 Sep 2014, at 01:48, Udo Schneider <[hidden email]> wrote: >>> >>>> All, >>>> >>>> I just finished a blog entry. It shows how to use Smalltalk blocks as parsers/translators. E.g. translating a Block >>>> >>>> [:customer | (customer joinDate year is: Date today year)] >>>> >>>> into an SQL-like String >>>> >>>> (YEAR(customers.joinDate) = 2014) >>>> >>>> The SQL stuff is just an example - you can create nearly any output. >>>> >>>> Check out http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html >>>> >>>> Maybe that's old stuff for some of you - but I hope it's interesting for some at least :-) >>>> >>>> Comments and feedback appreciated. >>>> >>>> CU, >>>> >>>> Udo >>>> >>>> >>> >>> >>> >> >> >> > > > |
In reply to this post by Udo Schneider
Phil,
I mixed up the books. It "Fundamentals of Smalltalk Programming Technique, Volume 1" by "Andres Valloud". Just checked it. http://www.lulu.com/shop/andres-valloud/fundamentals-of-smalltalk-programming-technique-volume-1/paperback/product-5299835.html CU, Udo On 23.09.14 16:05, Udo Schneider wrote: > Phil, > > If I remember correctly one of Andres Valloud's books has some more > information on Boolean (logic) and Smalltalk. I think it was "A > Mentoring Course on Smalltalk" [1]. Definitely worth a read!! > > CU, > > Udo > > > [1] > http://www.lulu.com/shop/andres-valloud/a-mentoring-course-on-smalltalk/paperback/product-3788890.html > > > > On 23.09.14 13:57, [hidden email] wrote: >> Thx for this! >> >> I'd say that the material is worthy of inclusion into a bool chapter. >> >> Phil >> >> Le 23 sept. 2014 12:51, "Udo Schneider" >> <[hidden email] >> <mailto:[hidden email]>> a écrit : >> >> Phil, >> >> I'd say that's an implementation of the "Material implication"[1] >> operator from Propositional calculus. >> >> You can write it as >> >> P -> Q >> >> and read it as "P implies Q" or (not 100% correct) "if P (is true) >> then Q (is true)". >> >> Let's take a look at the truth table: >> >> P | Q | P -> Q >> ---+---+------- >> t | t | t >> ---+---+------- >> >> inserting it into the statement above yields: >> >> "if true then true" which is true indeed. >> >> The funny thing starts when we look at the case(s), where P is >> false. The general (verbal) rule says that if the premise (P) is >> false the truth value of the conclusion doesn't matter. Hence the >> complete term is true: >> >> P | Q | P -> Q >> ---+---+------- >> f | t | t >> ---+---+------- >> f | f | t >> ---+---+------- >> >> There is one case left: What happens if the premise is true but the >> conclusion is false? That's in direct violation of the defintion >> which states that "if P (is true) then Q (is true)". As P is true >> and Q is false the truth value of the complete term is false! >> >> P | Q | P -> Q >> ---+---+------- >> t | f | f >> ---+---+------- >> >> Or to put it in different words: An implication can only be false if >> the premise is true but the conclusion is false. >> >> So we end up with this truth table: >> >> P | Q | P -> Q >> ---+---+------- >> t | t | t >> ---+---+------- >> f | t | t >> ---+---+------- >> f | f | t >> ---+---+------- >> t | f | f >> ---+---+------- >> >> We did not take a look yet, at how to implement this with basic >> boolean operators. So we need to take a look at the table and find >> the expression: Let's start with the exception (fourth case). We can >> express this as: >> >> !(P & !Q) -> "The term is false if P is true and Q is false" >> >> I added the inner term "P & !Q" to the table to make it easier to >> follow: >> >> >> P | Q | P -> Q | P & !Q | !(P & !Q) >> ---+---+--------+--------+----__------- >> t | t | t | f | t >> ---+---+--------+--------+----__------- >> f | t | t | t | f >> ---+---+--------+--------+----__------- >> f | f | t | f | t >> ---+---+--------+--------+----__------- >> t | f | f | f | t >> ---+---+--------+--------+----__------- >> >> The "last" step is to simplify the term "!(P & !Q)" using one of de >> Morgan's laws: >> !(A & B) == !A | !B >> >> Using this for our term gives >> >> !(P & !Q) == !P | !!Q == !P | Q >> >> P | Q | P -> Q | P & !Q | !(P & !Q) | !P | Q >> ---+---+--------+--------+----__-------+-------- >> t | t | t | f | t | t >> ---+---+--------+--------+----__-------+-------- >> f | t | t | t | f | f >> ---+---+--------+--------+----__-------+-------- >> f | f | t | f | t | t >> ---+---+--------+--------+----__-------+-------- >> t | f | f | f | t | t >> ---+---+--------+--------+----__-------+-------- >> >> So our final term is "correct" (proof in the truth table) and is >> equivalent to the smalltalk term: >> >> !P | Q := self not or: [aBlock value] >> >> >> I have to admit though that implications in Propositional calculus >> really gave me a headache. You might simply want to accept that they >> are defined this way. And maybe it doesn't help ... but there are >> even more strange things lurking around the corner [4] :-) >> >> Although not immidiatly obvious all the terms in Propositional >> calculus do not neccessarly have a semantic meaning in context to >> each other. They are totaly independent. The only thing that counts >> is the truth value of its terms. E.g. something like this is >> mathematically/syntacically valid but doesn't make any sense from a >> semantic point of view: >> >> P := I am 12y old >> Q := It rains >> >> The term "P -> Q" is perfectly fine mathematically/syntacically but >> doesn't mean anything in terms of semantics. >> >> >> Hope this helps. >> >> CU, >> >> Udo >> >> >> [1] >> >> http://en.wikipedia.org/wiki/__Material_implication_(rule_of___inference) >> >> <http://en.wikipedia.org/wiki/Material_implication_(rule_of_inference)> >> [2] http://en.wikipedia.org/wiki/__Propositional_calculus >> <http://en.wikipedia.org/wiki/Propositional_calculus> >> [3] http://en.wikipedia.org/wiki/__De_Morgan's_laws >> <http://en.wikipedia.org/wiki/De_Morgan's_laws> >> [4] >> http://en.wikipedia.org/wiki/__Paradoxes_of_material___implication >> <http://en.wikipedia.org/wiki/Paradoxes_of_material_implication> >> >> On 23.09.14 10:49, [hidden email] >> <mailto:[hidden email]> wrote: >> >> Cool article & technique indeed. Ah Smalltalk, where were you >> all those >> years ;-) >> >> Speaking of PetitParser, which is excellent indeed, there is >> this #==> >> method in Boolean. >> >> PetitParser uses that a lot. I can use the thing but do not >> really >> grasps how it works. >> >> Now, the method comment says: >> >> Boolean #==> aBlock >> "The material conditional, also known as the material >> implication or >> truth functional conditional.Correspond to not ... or ... and >> does not >> correspond to the English if...then... construction. >> known as: >> b if a >> a implies b >> if a then b >> b is a consequence of a >> a therefore b (but note: 'it is raining therefore it is >> cloudy' is >> implication; 'it is autumn therefore the leaves are falling' is >> equivalence). >> Here is the truth table for material implication: >> p | q | p ==> q >> -------|-------|------------- >> T | T | T >> T | F | F >> F | T | T >> F | F | T >> " >> >> ^self not or: [aBlock value] >> >> >> This is still a bit foggy to me. >> >> Anyone caring to shed some light on that? >> What are the typical ways to use that? >> >> TIA >> Phil >> >> >> >> >> On Tue, Sep 23, 2014 at 10:07 AM, Udo Schneider >> <[hidden email] >> <mailto:[hidden email]> >> <mailto:[hidden email] >> <mailto:[hidden email]>>> >> wrote: >> >> > just as it is black magic for me now :D >> The nice thing about this approach is the fact that it >> "just" >> piggybacks the normal Smalltalk message sending. So you can >> step >> through it using the Debugger - it's Smalltalk all the way >> down. >> >> I still remember my first shock when (having no formal >> background on >> parsing theory at that time) I saw the parsing tables >> generated by >> T-Gen. Of course it was Smalltalk ... but understanding >> those tables >> was a nightmare. >> >> PetitParser is the gold standard here IMHO. It is able to >> parse >> arbitrary input (compared to my block expressions only). >> And you can >> still use the Debugger to step through the parsing >> process *and >> still understand what's going on!* >> >> CU, >> >> Udo >> >> On 23.09.14 09:54, kilon alios wrote: >> >> just as it is black magic for me now :D >> >> At least I get the general feeling. I am new to parsing >> too, so >> far I >> have only played with regex parsing. Not the most >> smalltalkish >> way but >> it works well so far. >> >> On Tue, Sep 23, 2014 at 9:39 AM, Udo Schneider >> <[hidden email] >> <mailto:[hidden email]> >> <mailto:[hidden email] >> <mailto:[hidden email]>> >> <mailto:udo.schneider@ >> <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> >> <mailto:[hidden email] >> <mailto:[hidden email]>>>> >> wrote: >> >> Hi Estaban, >> >> I think the first time I saw this pattern was in >> ReStore on >> Dolphin >> Smalltalk. I didn't understand it's implementation >> back then. I >> assume that it's similar to what I described >> though. But >> having a >> Smalltalk block automagically creating the >> equivalent SQL >> SELECT >> expression was like black magic at that time :-) >> >> CU, >> >> Udo >> >> >> >> >> On 23.09.14 04:15, Esteban A. Maringolo wrote: >> >> Excellent article. >> >> I think GLORP uses a similar technique to >> setup its >> expressions, and >> also have issues with #and:/#or: selectors >> due to >> inlining, so >> it uses >> AND:/#OR: instead. >> >> Regards! >> >> Esteban A. Maringolo >> >> pd: Your blog and it's choosen topic made me >> remember >> http://use-the-index-luke.com/ >> >> 2014-09-22 20:48 GMT-03:00 Udo Schneider >> >> <[hidden email] >> <mailto:[hidden email]> >> <mailto:[hidden email] >> <mailto:[hidden email]>> >> <mailto:udo.schneider@ >> <mailto:udo.schneider@>__homead__dress.de <http://homeaddress.de> >> <mailto:[hidden email] >> >> <mailto:[hidden email]>>>>__: >> >> >> All, >> >> I just finished a blog entry. It shows how >> to use >> Smalltalk >> blocks as parsers/translators. E.g. >> translating a Block >> >> [:customer | (customer joinDate >> year is: Date >> today year)] >> >> into an SQL-like String >> >> (YEAR(customers.joinDate) = 2014) >> >> The SQL stuff is just an example - you can >> create >> nearly any >> output. >> >> Check out >> >> http://readthesourceluke.__blo____gspot.de/2014/09/block-______translators-parsing-magic.html >> >> >> <http://blo__gspot.de/2014/09/block-____translators-parsing-magic.html> >> >> >> <http://blogspot.de/2014/09/__block-__translators-parsing-__magic.html >> >> <http://blogspot.de/2014/09/block-__translators-parsing-magic.html>> >> >> >> >> <http://readthesourceluke.__bl__ogspot.de/2014/09/block-____translators-parsing-magic.html >> >> >> <http://blogspot.de/2014/09/block-__translators-parsing-magic.html> >> >> >> <http://readthesourceluke.__blogspot.de/2014/09/block-__translators-parsing-magic.html >> >> >> <http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html>__>__> >> >> >> Maybe that's old stuff for some of you - >> but I hope >> it's >> interesting for some at least :-) >> >> Comments and feedback appreciated. >> >> CU, >> >> Udo >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> >> > > > > |
In reply to this post by Udo Schneider
Hi udo
I agree with sven :) We could easily turn your blog into a chapter for a future book :) I have the impression that the blog is how to avoid parsing and still get translation done! Stef > Hi Sven, > > thanks for the feedback. > > > Keep that kind of stuff coming, it is very helpful. > I'll try to. It just always takes so long to write stuff. But I think > you know that, don't you? :-) > > CU, > > Udo > > On 23.09.14 16:00, Sven Van Caekenberghe wrote: >> Hi Udo, >> >> This is really an excellent article: I enjoyed reading it a lot. >> >> It is well written, has lots of relevant code examples and a nice >> pace, but above all it is really interesting. >> >> Thanks a lot. >> >> Keep that kind of stuff coming, it is very helpful. >> >> Sven >> >> On 23 Sep 2014, at 01:48, Udo Schneider >> <[hidden email]> wrote: >> >>> All, >>> >>> I just finished a blog entry. It shows how to use Smalltalk blocks >>> as parsers/translators. E.g. translating a Block >>> >>> [:customer | (customer joinDate year is: Date today year)] >>> >>> into an SQL-like String >>> >>> (YEAR(customers.joinDate) = 2014) >>> >>> The SQL stuff is just an example - you can create nearly any output. >>> >>> Check out >>> http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html >>> >>> Maybe that's old stuff for some of you - but I hope it's interesting >>> for some at least :-) >>> >>> Comments and feedback appreciated. >>> >>> CU, >>> >>> Udo >>> >>> >> >> >> > > > > |
In reply to this post by Sven Van Caekenberghe-2
> Yes I do, but you also know (it was clear from the article) that you learn a lot yourself from writing something for public consumption. Most people underestimate how powerful that is. :) In fact I only write for that: to force myself to deeply understand something and be able to forget it :) Stef |
In reply to this post by stepharo
Hi Stef,
> We could easily turn your blog into a chapter for a future book :) Wow! I didn't really expect that! But I'd happy to help any way I can. Maybe by adding some bits an pieces how to parse blocks with multiple expressions? I have that working for a project I'm working on - but it isn't nice enough for an article (yet). > I have the impression that the blog is how to avoid parsing and still > get translation done! Let me put it that way: I love using PetitParser - but sometimes parsing an expression compared to full code is more than enough. It also has the benefit of blending nicely with regular Smalltalk tools (code, not Strings!) w/o hooking into the compiler - which makes it more portable by default. So you're right - it provides a "kind of AST" which allows you to reason about some Smalltalk expression w/o relying on a full parser. I'll use it for translating only though... The limitations of this approach are clear - but if you need more than the tools you'll need are clear and known as well. CU, Udo On 25.09.14 22:06, stepharo wrote: > Hi udo > > I agree with sven :) > > We could easily turn your blog into a chapter for a future book :) > I have the impression that the blog is how to avoid parsing and still > get translation done! > > Stef >> Hi Sven, >> >> thanks for the feedback. >> >> > Keep that kind of stuff coming, it is very helpful. >> I'll try to. It just always takes so long to write stuff. But I think >> you know that, don't you? :-) >> >> CU, >> >> Udo >> >> On 23.09.14 16:00, Sven Van Caekenberghe wrote: >>> Hi Udo, >>> >>> This is really an excellent article: I enjoyed reading it a lot. >>> >>> It is well written, has lots of relevant code examples and a nice >>> pace, but above all it is really interesting. >>> >>> Thanks a lot. >>> >>> Keep that kind of stuff coming, it is very helpful. >>> >>> Sven >>> >>> On 23 Sep 2014, at 01:48, Udo Schneider >>> <[hidden email]> wrote: >>> >>>> All, >>>> >>>> I just finished a blog entry. It shows how to use Smalltalk blocks >>>> as parsers/translators. E.g. translating a Block >>>> >>>> [:customer | (customer joinDate year is: Date today year)] >>>> >>>> into an SQL-like String >>>> >>>> (YEAR(customers.joinDate) = 2014) >>>> >>>> The SQL stuff is just an example - you can create nearly any output. >>>> >>>> Check out >>>> http://readthesourceluke.blogspot.de/2014/09/block-translators-parsing-magic.html >>>> >>>> >>>> Maybe that's old stuff for some of you - but I hope it's interesting >>>> for some at least :-) >>>> >>>> Comments and feedback appreciated. >>>> >>>> CU, >>>> >>>> Udo >>>> >>>> >>> >>> >>> >> >> >> >> > > > |
Hi Udo,
On Thu, Sep 25, 2014 at 10:28 PM, Udo Schneider <[hidden email]> wrote: >> We could easily turn your blog into a chapter for a future book :) > Wow! I didn't really expect that! But I'd happy to help any way I can. Maybe > by adding some bits an pieces how to parse blocks with multiple expressions? I think the most important thing to start with is not to add content, but to put the content you already have in https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english. You will have to use Pillar: https://ci.inria.fr/pharo-contribution/job/EnterprisePharoBook/lastSuccessfulBuild/artifact/PillarChap/Pillar.pillar.pdf -- Damien Cassou http://damiencassou.seasidehosting.st "Success is the ability to go from one failure to another without losing enthusiasm." Winston Churchill |
Hi Damien,
I think the most important thing to start with is not to add content, > but to put the content you already have in > https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english. > You will have to use Pillar: > https://ci.inria.fr/pharo-contribution/job/EnterprisePharoBook/lastSuccessfulBuild/artifact/PillarChap/Pillar.pillar.pdf I did write the entry in Markdown - so converting it to Pillar shouldn't be a big deal. I'll start translating t now. Best Regards, Udo On 28.09.2014 11:08, Damien Cassou wrote: > Hi Udo, > > On Thu, Sep 25, 2014 at 10:28 PM, Udo Schneider > <[hidden email]> wrote: >>> We could easily turn your blog into a chapter for a future book :) >> Wow! I didn't really expect that! But I'd happy to help any way I can. Maybe >> by adding some bits an pieces how to parse blocks with multiple expressions? > > > I think the most important thing to start with is not to add content, > but to put the content you already have in > https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english. > You will have to use Pillar: > https://ci.inria.fr/pharo-contribution/job/EnterprisePharoBook/lastSuccessfulBuild/artifact/PillarChap/Pillar.pillar.pdf > |
Hi Damien,
moving to Pillar was quite easy: http://pillarhub.pharocloud.com/hub/UdoSchneider/6bqsrq7ut85ddotzjy2xqrtth How to proceed? Best Regards, Udo On 29.09.14 18:47, Udo Schneider wrote: > Hi Damien, > > I think the most important thing to start with is not to add content, > > but to put the content you already have in > > > https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english. > > You will have to use Pillar: > > > https://ci.inria.fr/pharo-contribution/job/EnterprisePharoBook/lastSuccessfulBuild/artifact/PillarChap/Pillar.pillar.pdf > > I did write the entry in Markdown - so converting it to Pillar shouldn't > be a big deal. I'll start translating t now. > > Best Regards, > > Udo > > > > On 28.09.2014 11:08, Damien Cassou wrote: >> Hi Udo, >> >> On Thu, Sep 25, 2014 at 10:28 PM, Udo Schneider >> <[hidden email]> wrote: >>>> We could easily turn your blog into a chapter for a future book :) >>> Wow! I didn't really expect that! But I'd happy to help any way I >>> can. Maybe >>> by adding some bits an pieces how to parse blocks with multiple >>> expressions? >> >> >> I think the most important thing to start with is not to add content, >> but to put the content you already have in >> https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english. >> You will have to use Pillar: >> https://ci.inria.fr/pharo-contribution/job/EnterprisePharoBook/lastSuccessfulBuild/artifact/PillarChap/Pillar.pillar.pdf >> >> > > > > |
On Mon, Sep 29, 2014 at 9:03 PM, Udo Schneider
<[hidden email]> wrote: > How to proceed? 1- please give me your github username 2- clone https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english 3- read the README and add your chapter If you prefer, you can also send a pull request. -- Damien Cassou http://damiencassou.seasidehosting.st "Success is the ability to go from one failure to another without losing enthusiasm." Winston Churchill |
On 30.09.14 17:50, Damien Cassou wrote:
> 1- please give me your github username krodelin > 2- clone https://github.com/SquareBracketAssociates/PharoForTheEnterprise-english > 3- read the README and add your chapter > > If you prefer, you can also send a pull request. I'll check the project structure and tell you. But I assume I'd prefer working directly - even if in "my" directory only. Best Regards, Udo |
On Wed, Oct 1, 2014 at 5:53 PM, Udo Schneider
<[hidden email]> wrote: > I'll check the project structure and tell you. But I assume I'd prefer > working directly - even if in "my" directory only. you should have received an invitation -- Damien Cassou http://damiencassou.seasidehosting.st "Success is the ability to go from one failure to another without losing enthusiasm." Winston Churchill |
On 02.10.14 18:17, Damien Cassou wrote:
> you should have received an invitation Yepp - I did. Already committed the Blog entry 1:1. Working on cleaning up the language now. BTW: Is there any guide regarding the kind of language (e.g. tonality) of the book. I'd change the it given the fact that the blog entry is pretty informal which is IMHO not appropriate for a book ... Thanks, Udo |
On Thu, Oct 2, 2014 at 8:43 PM, Udo Schneider
<[hidden email]> wrote: > > BTW: Is there any guide regarding the kind of language (e.g. tonality) of > the book. I'd change the it given the fact that the blog entry is pretty > informal which is IMHO not appropriate for a book ... no such guide exist. Do your best and we will do another pass on it afterwards. -- Damien Cassou http://damiencassou.seasidehosting.st "Success is the ability to go from one failure to another without losing enthusiasm." Winston Churchill |
Free forum by Nabble | Edit this page |