From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-qv1-xf29.google.com (mail-qv1-xf29.google.com [IPv6:2607:f8b0:4864:20::f29]) by sourceware.org (Postfix) with ESMTPS id AE733385841F for ; Sat, 13 Apr 2024 22:45:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AE733385841F 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 AE733385841F Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::f29 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713048333; cv=none; b=ICi6F0fyG82a5x3j09RmlBjfA32CPgPawm0qUwqOY8v2HhZl9glCBHaDfFZ3t9EeELE58hpyc6drp3tDa3eUMJfrdiIpNlGrrK0f7q9E2DRQN4qDL8a6i26xkbEaA+ahRo0MyAxdaylgvKtxMuqJoHTzhpuHqk9OzcE/ZQON+yw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1713048333; c=relaxed/simple; bh=95cLg9CtIWbUm4o7aUnjyn6Z1fv4cJYVLiotz6ujf1k=; h=DKIM-Signature:MIME-Version:From:Date:Message-ID:Subject:To; b=nbCSvZtiRBcjzUgh1oxk+7Q1MDuK/9ia++8Bls+UpcewIqURaCC7VzwDFtXF1zOVkPWABQonUX5T/vxv12sWkxzAxlQ/UD+ruahc3++1xUXQi73SteP0T3A5b8xpGUkdpmFGgJf/LzSo9BVRQSwc1eNkfVk3ccq2wIUue100dSE= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-qv1-xf29.google.com with SMTP id 6a1803df08f44-699320fcbc1so14469326d6.3 for ; Sat, 13 Apr 2024 15:45:30 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1713048330; x=1713653130; 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=2kIkvV+WYLnACTD5D9V0xA0laFe+wn1IDoOdPqyNm6I=; b=FZfV7Pr8sqXgujgce0Z51RMfKNuiPKt47ZoHSVz+Bbycviph1v9v03Z8Z7EamIY6Qr 1RP/S+NAM0kfEfc25kxJke32/KJoU5UTTTy3ARj5j0EDyIJM4DhiVaHC8cT+EJ7+rO7v L9g/1eHg0U6YlozP2YDSgzN8NGE2OQbXj86aoRmeJf1QREH159jQ9gtOk2K/zAJaTmAd sB3XWxggeWED8I7drKF5+SGGMDzlilTq8+zUeI19p31dEJAoiwQ2+OR8dohp464TAUlx 5Qa60VPh34YyFMlaHtDpFwDw/emxYTISOxJtE2RBgx6zeNKKwJLcYlmwXMW+3hkESMB4 tcaA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1713048330; x=1713653130; 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=2kIkvV+WYLnACTD5D9V0xA0laFe+wn1IDoOdPqyNm6I=; b=Zm3gVGbWi7xHFnmIT3cYhWaZzoPGyTDtKtgdJ4mQAQERxG3UjYAc1AeUmqU5gfi0T2 cIN0+OcWd27xH14NgcCQaZnWKWe2Dq1sDrAix5JP4e2/Py3GNAzRWCztmMxm7kqdbxlV P5xaBEJhsDn9A/xdi79IH/H3awSTgV7GTQpvT3ntnQdUmJUw4eV5L/PpzFjvvNwdGhzv E/meebiZTThegAujwPv6SEwr3/mgI082KLYL9654vBAB7EPXsI13AnF9+BTZDGsErlFI nOTT6CoULDJt9uCBkW9ZoPG5IXjz3JpxsBlLFjMIg7c6G6BrR4G8iqzxuvEVh80d8yRA 9zvA== X-Gm-Message-State: AOJu0YzHMFN6mUjUTwi2N6TXjuMrCoTWBuFx9ttArcBj5BZPUfIySQHs RDymRdNurWQAMWOOSdSsJf1IrVrOSlAZkFGTqnFuGoiUT0B1IgZiog/qSJXeDEkAc3KbDGABiAj FHcwtdyrPTh+vezXHtPuTUF6osSMtih6J X-Google-Smtp-Source: AGHT+IF3eLe/pKz7AUoWs2qGUJx8GG8HmF/l8B0/5+QKhyAHz6K+lGfiUuWziyaiSWwN4bS0BsnkMKoR6k1M1WH1nbs= X-Received: by 2002:ad4:58a9:0:b0:69b:167e:7f67 with SMTP id ea9-20020ad458a9000000b0069b167e7f67mr5564501qvb.7.1713048329771; Sat, 13 Apr 2024 15:45:29 -0700 (PDT) MIME-Version: 1.0 References: <2dec7074-c846-413c-a247-18bae45813d7@bothner.com> In-Reply-To: <2dec7074-c846-413c-a247-18bae45813d7@bothner.com> From: Damien Mattei Date: Sun, 14 Apr 2024 00:45:18 +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="0000000000002de188061602259a" X-Spam-Status: No, score=-0.6 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: --0000000000002de188061602259a Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable 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 wrote: > > > 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 similar. > > -- > --Per Bothner > per@bothner.com http://per.bothner.com/ > --0000000000002de188061602259a--