From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qv1-xf33.google.com (mail-qv1-xf33.google.com [IPv6:2607:f8b0:4864:20::f33]) by sourceware.org (Postfix) with ESMTPS id 3D13E3849AFB for ; Tue, 16 Apr 2024 06:38:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3D13E3849AFB Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 3D13E3849AFB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::f33 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713249486; cv=none; b=Nwor0LPHYG1HUw0oxHoanPUfJpe4V2FGiGE7wqqkuQXaL7BI2G22iuh5ivGqBOmnnat9WKGPJz3xnYhx5hvwa4K7a03+E629CL4HTcMkobHGgNkbHakBB8Bgw2L54ltblVPN+wFEsNmsSk4DsyYk4qlkOxWilnj9Jb6UaRho/w0= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713249486; c=relaxed/simple; bh=GcqIcIuZoJeD+IW+o5YebgOF94XrHlsPlfEGmn6OaE8=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=tsIXM5gRHIco/uhZgXotKK+LVo5VNm+q6P8HWwpE88CvkE2/cHJLANk9rjMQaopWbuW/ssE5NXsH8md8sMtvJhE7taAxzR8uNZnKh4Yyo0QKIFKTEPZD32CLXmkqCBBDZqCJJ8KB1AkQL0EDaQ2JgW6te6PX10NnkW0sxHUhJVE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-qv1-xf33.google.com with SMTP id 6a1803df08f44-6962950c6bfso31966906d6.2 for ; Mon, 15 Apr 2024 23:38:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713249482; x=1713854282; darn=sourceware.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=YjlC1oe29mwS1wby+Bz6RHJzksLko43wjBPECBmFAq4=; b=dANm77bYa3MupcAcSAHCMgkDvyMvLxPZ4+kXdNfIWqhk7YIoenWo5pKqQI4TaKdgqt /zAAr+JUacv+htWIHzyyX6gfU0fq1Ri/EnFWEmw5SenCVUt8mZ8RLpp+y80o71QaTfRf +xxjAOKWkftcyp+fvJ9U7peOImIHCT7oYVCTjL2OjJEl5HXNvjSN2rCElpDSJnCQKRMv JsuxkEvLQwMrAyp4QADKAA8VnF5cG35N8Jexlw2mifAgTRSW2yjQjzPfl/p9SD++cZSV AyFfw2o5oqex+HI1XieclYs4QJQHjjoUQxbcryJZIV7fIsn+MxUflHRA+NGpzPVbGBUf kcvw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713249482; x=1713854282; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=YjlC1oe29mwS1wby+Bz6RHJzksLko43wjBPECBmFAq4=; b=cK4Whf+qu9DoJnXyUcnaTBBt/i66FND4D8sFHNdbncYM1fhgu8PCjXEXECWR/eK4i4 Cpp376wLjQ7z9KGAQuM2ouqO6nmHm/xCbzuGhT8ZfaO7UyZXFd6guYQtPKZoITAJDAuP 88TQ3MrpPBIqRvKUQpAADDEQqd8FDns4OghIgXtxo0e6Urg6ulLd7UjwsLUorVVrPlIM xOFO3FfFMTcpSVPgS4p3b9e/85UYNjA60iuRj3rtdBBu4P7eitdY5tp/g64QOCdgANjT IRWAA5pL0BYJ+GRWxT/NBh/aa3uPV+wWcNzXJk/RD0G9ovOhHhBkazubKfoSMOOZkOUD Oukg== X-Gm-Message-State: AOJu0Yzw4EVxptb6IILvQzGUG9W69ca1+oWJT4yz70Mo03r6o06ltKjn rzkVkOMixUy1shdAEKwj9y/UdFoDSa0YY5yn4xqEiLI3p1zD7pNUXhb86UiNcZq/YIABYmxJDop KWI45HmqwhUk4JdDQgTc/gxKBTc9naArq X-Google-Smtp-Source: AGHT+IHv89QNckjfyoerFH9G1Wl9bd5XoQDdQwmRPL8fIMzUoyoGdG0z1U/+iahkLhkDb2GLsdqzRmXtVQv8sB2Dreo= X-Received: by 2002:a05:6214:4c0a:b0:69b:1aec:88fb with SMTP id qh10-20020a0562144c0a00b0069b1aec88fbmr11056707qvb.23.1713249482229; Mon, 15 Apr 2024 23:38:02 -0700 (PDT) MIME-Version: 1.0 References: <2dec7074-c846-413c-a247-18bae45813d7@bothner.com> In-Reply-To: From: Damien Mattei Date: Tue, 16 Apr 2024 08:37:48 +0200 Message-ID: Subject: Re: how to know if a variable is defined To: Per Bothner Cc: kawa mailing list Content-Type: multipart/alternative; boundary="000000000000ccd0c1061630fae4" X-Spam-Status: No, score=-0.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000ccd0c1061630fae4 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable this could not works because the defined-symbol? used in the macro if-defined return false because at the expansion of the macro the symbol is not defined. Instead at run-time, this works: #|kawa:21|# (define (foo2) (define x 7) (defined-symbol? x)) #|kawa:22|# (foo2) #t On Sun, Apr 14, 2024 at 12:58=E2=80=AFAM Damien Mattei wrote: > just a few add, it has nothing to see with module,the same behavior > happens at REPL and toplevel: > > #|kawa:1|# (define-syntax defined-symbol? > #|.....2|# (syntax-rules () > #|.....3|# ((_ x) (call-with-current-continuation > #|.....4|# (lambda (exit) > #|.....5|# (with-exception-handler > #|.....6|# (lambda (e) > #|.....7|# (display "defined-symbol? : undefined") (newline) > #|.....8|# (exit #f)) ; eval failed =3D> not defined > #|.....9|# (lambda () > #|....10|# (eval x (interaction-environment)) > #|....11|# #t))))))) ; eval suceeded =3D> defined > #|kawa:12|# (define-syntax if-defined > #|.....13|# (lambda (stx) > #|.....14|# (syntax-case stx () > #|.....15|# ((_ id iftrue iffalse) > #|.....16|# (let ((where (defined-symbol? #'id))) ;;(quote id)))) > #|.....17|# (display "if-defined : where=3D") (display where) (newline) > #|.....18|# (display "id=3D") (display #'id) (newline) > #|.....19|# (if where #'iftrue #'iffalse)))))) > #|kawa:20|# (define-syntax <- > #|.....21|# (lambda (stx) > #|.....22|# > #|.....23|# (syntax-case stx () > #|.....24|# > #|.....25|# ((_ var expr) > #|.....26|# > #|.....27|# #`(if-defined var > #|.....28|# (set! var expr) > #|.....29|# (define var expr)))))) > #|kawa:30|# (define (foo) > #|.....31|# (define expr2 '()) > #|.....32|# > #|.....33|# (<- expr2 7)) > defined-symbol? : undefined > if-defined : where=3D#f > id=3Dexpr2 > /dev/tty:33:7: duplicate declaration of 'expr2' > /dev/tty:31:11: (this is the previous declaration of 'expr2') > > > On Sun, Apr 14, 2024 at 12:45=E2=80=AFAM Damien Mattei > wrote: > >> hello, >> >> i ported my code from guile that use ,as you say it 'exceptions': >> >> ;; #|kawa:57|# >> ;; #|kawa:58|# (define r 2) >> ;; #|kawa:59|# (if-defined r 'defined (define r 7)) >> ;;if-defined : where=3D#t >> ;; id=3Dr >> ;; (if-defined r 'defined (define r 7)) >> ;; defined >> ;; #|kawa:60|# r >> ;; 2 >> ;; #|kawa:61|# (defined-symbol? r) >> ;; #t >> ;; #|kawa:62|# (defined-symbol? t) >> ;; /dev/tty:62:18: warning - no declaration seen for t >> ;; defined-symbol? : undefined >> ;; #f >> ;; #|kawa:63|# (let ((k 7)) (defined-symbol? k)) >> ;; #t >> ;; >> >> (define-syntax defined-symbol? >> (syntax-rules () >> ((_ x) (call-with-current-continuation >> (lambda (exit) >> (with-exception-handler >> (lambda (e) >> (display "defined-symbol? : undefined") (newline) >> (exit #f)) ; eval failed =3D> not defined >> (lambda () >> (eval x (interaction-environment)) >> #t))))))) ; eval suceeded =3D> defined >> >> >> ;; #|kawa:86|# (define k 0) >> ;; #|kawa:87|# (let loop () (if (< k 4) (let () (display k) (newline) (<- >> k (+ k 1)) (loop)))) >> ;; if-defined : where=3D#t >> ;; id=3Dk >> ;; 0 >> ;; 1 >> ;; 2 >> ;; 3 >> ;; #|kawa:88|# (let () (define k 0) (let loop () (if (< k 4) (let () >> (display k) (newline) (<- k (+ k 1)) (loop))))) >> ;; if-defined : where=3D#t >> ;; id=3Dk >> ;; 0 >> ;; 1 >> ;; 2 >> ;; 3 >> ;; #|kawa:89|# (let () (define s 0) (let loop () (if (< s 4) (let () >> (display s) (newline) (<- s (+ s 1)) (loop))))) >> ;; if-defined : where=3D#t >> ;; id=3Ds >> ;; 0 >> ;; 1 >> ;; 2 >> ;; 3 >> ;; #|kawa:90|# (let ((s 0)) (let loop () (if (< s 4) (let () (display s) >> (newline) (<- s (+ s 1)) (loop))))) >> ;; if-defined : where=3D#t >> ;; id=3Ds >> ;; 0 >> ;; 1 >> ;; 2 >> ;; 3 >> >> (define-syntax if-defined >> (lambda (stx) >> (syntax-case stx () >> ((_ id iftrue iffalse) >> (let ((where (defined-symbol? #'id))) ;;(quote id)))) >> (display "if-defined : where=3D") (display where) (newline) >> (display "id=3D") (display #'id) (newline) >> (if where #'iftrue #'iffalse)))))) >> >> i use the code in conjunction with this macro: >> (define-syntax <- >> (lambda (stx) >> >> (syntax-case stx () >> >> #`(if-defined var >> (set! var expr) >> (define var expr)))))) >> >> it works better than guile (guile fails on the let () tests...: >> scheme@(guile-user)> (let ((k 0)) (let loop () (if (< k 4) (let () >> (display k) (newline) (<- k (+ k 1)) (loop))))) >> defined-symbol? : undefined >> if-defined : where=3D#f >> id=3D# >> # >> ice-9/boot-9.scm:1685:16: In procedure raise-exception: >> In procedure +: Wrong type argument in position 1: # >> >> Entering a new prompt. Type `,bt' for a backtrace or `,q' to continue. >> >> ), as you can see the examples , but in some place of my code kawa fails >> too, i made a simplified example from the whole code: >> >> for example if i put all the stuff in a module test-defined.scm: >> >> (module-name test-defined) >> >> (export foo) >> >> >> >> (define-syntax defined-symbol? >> (syntax-rules () >> ((_ x) (call-with-current-continuation >> (lambda (exit) >> (with-exception-handler >> (lambda (e) >> (display "defined-symbol? : undefined") (newline) >> (exit #f)) ; eval failed =3D> not defined >> (lambda () >> (eval x (interaction-environment)) >> #t))))))) ; eval suceeded =3D> defined >> >> (define-syntax if-defined >> (lambda (stx) >> (syntax-case stx () >> ((_ id iftrue iffalse) >> (let ((where (defined-symbol? #'id))) ;;(quote id)))) >> (display "if-defined : where=3D") (display where) (newline) >> (display "id=3D") (display #'id) (newline) >> (if where #'iftrue #'iffalse)))))) >> >> >> >> (define-syntax <- >> (lambda (stx) >> >> (syntax-case stx () >> >> ((_ var expr) >> >> #`(if-defined var >> (set! var expr) >> (define var expr)))))) >> >> >> >> >> (define (foo) >> (define expr2 '()) >> >> (<- expr2 7)) >> >> then it fails: >> >> #|kawa:1|# (require test-defined)defined-symbol? : undefined >> if-defined : where=3D#f >> id=3Dexpr2 >> (require test-defined) >> /Users/mattei/Scheme-PLUS-for-Kawa/test-defined.scm:95:7: duplicate >> declaration of 'expr2' >> /Users/mattei/Scheme-PLUS-for-Kawa/test-defined.scm:93:11: (this is the >> previous declaration of 'expr2') >> >> it finds that expr2 is not defined,then expand a (define expr2 ...) but >> then cause an error of duplicate declaration of expr2 >> >> >> On Thu, Apr 11, 2024 at 3:01=E2=80=AFAM Per Bothner wr= ote: >> >>> >>> >>> On 4/10/24 14:49, Damien Mattei via Kawa wrote: >>> > hello, >>> > >>> > is there a way to know if a variable is defined in Kawa? >>> > >>> > (like 'identifier-binding' in Racket) >>> >>> If you need to know if a variable is bound in the dynamic environment, >>> you could perhaps use eval wrapped in an exception handler. >>> >>> There are probably better ways, but I don't remember off-hand. >>> >>> Can't think of anything to use if you need information about lexical >>> bindings. >>> I supposed you could implemented identifier-binding or something simila= r. >>> >>> -- >>> --Per Bothner >>> per@bothner.com http://per.bothner.com/ >>> >> --000000000000ccd0c1061630fae4--