---------- Forwarded message --------- From: Stefan Israelsson Tampe Date: Thu, Feb 3, 2022 at 5:41 PM Subject: Re: [Patch] definitions in when, unless, do as well as in cond- and case-clauses To: Linus Björnstam using an implicit let in conditionals are bad in that you cannot escape from the let form which means that you loos conditional defines for example in the toplevel. e.g. (if 1 (define a 1) (define a 2)) will not work at the top level because of an implicit let. If you need implicit defines a simple macro for those are easy and if we need to state a syntax in stone for those, we should name them differently like when-let unless-let if-let cond-let case-let. On Thu, Feb 3, 2022 at 11:55 AM Linus Björnstam < linus.bjornstam@veryfast.biz> wrote: > Hi guys, > > It looks like a 3.0.8 might be happening. I am curious to know whether > this (perhaps minus the do form) is considered something that the > maintainers of guile could find interesting. > > If subset compatibility of r6|7rs is desired, I could provide a patch for > those files as well so that they enforce the distinction between definition > and expression context. > > I myself find this a worthwhile patch since it has no drawbacks. a (let () > ...) without definitions does not start a new lexical context and runs as > fast as a begin, so there should be no performance regressions. > > It also removes the last bodies in guile forms that have a definition > context, which may be confusing for beginners. > > I would say that the compatibility question with the enforcing cond of > rnrs is the only thing that needs proper addressing. > > Best > Linus Björnstam > > On Wed, 16 Jun 2021, at 21:11, Linus Björnstam wrote: > > Hi there! > > > > This patch updates some derived conditional forms (and do and and-let*) > > to support definitions in expression context. Meaning it makes this > > valid code: > > > > (cond > > ((pred? arg) > > (define a (something arg)) > > (when (error-case a) > > (error "a is broken")) > > (define b (something2 a)) > > (when (= 3 *log-level*) > > (display "logging something1 and 2 as successful")) > > (define c (something3 b a)) > > (when (odd? c) > > (error "something went wrong in something3")) > > c) > > (else > > ;;chosen by fair dice roll. Guaranteed to be random > > 4))) > > > > While awful, is sometimes what the world makes us do. > > > > The change means cond, case, when and unless behaves like it does in > > racket. Do was below case, so I changed that as well, and will actually > > become yet another way guile is superior to racket. > > > > I did also change the documentation, but I learned english by watching > > Beverly Hills cop, so that might need some fine touches by a capable > > english speaker. > > > > > > Best regards > > Linus Björnstam > > Attachments: > > * 0001-Allow-definitions-in-derived-conditional-forms.patch > >