public inbox for kawa@sourceware.org
 help / color / mirror / Atom feed
* how to know if a variable is defined
@ 2024-04-10 21:49 Damien Mattei
  2024-04-11  1:00 ` Per Bothner
  0 siblings, 1 reply; 6+ messages in thread
From: Damien Mattei @ 2024-04-10 21:49 UTC (permalink / raw)
  To: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 121 bytes --]

hello,

is there a way to know if a variable is defined in Kawa?

(like 'identifier-binding' in Racket)

regards,
damien

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: how to know if a variable is defined
  2024-04-10 21:49 how to know if a variable is defined Damien Mattei
@ 2024-04-11  1:00 ` Per Bothner
  2024-04-11  9:51   ` Lassi Kortela
  2024-04-13 22:45   ` Damien Mattei
  0 siblings, 2 replies; 6+ messages in thread
From: Per Bothner @ 2024-04-11  1:00 UTC (permalink / raw)
  To: Damien Mattei, kawa mailing list



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/

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: how to know if a variable is defined
  2024-04-11  1:00 ` Per Bothner
@ 2024-04-11  9:51   ` Lassi Kortela
  2024-04-13 22:45   ` Damien Mattei
  1 sibling, 0 replies; 6+ messages in thread
From: Lassi Kortela @ 2024-04-11  9:51 UTC (permalink / raw)
  To: Per Bothner, Damien Mattei, kawa mailing list

"Get value of symbol" is a common newbie question in Lisp. In every case 
a better solution is apparent once the complete problem is explained.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: how to know if a variable is defined
  2024-04-11  1:00 ` Per Bothner
  2024-04-11  9:51   ` Lassi Kortela
@ 2024-04-13 22:45   ` Damien Mattei
  2024-04-13 22:58     ` Damien Mattei
  1 sibling, 1 reply; 6+ messages in thread
From: Damien Mattei @ 2024-04-13 22:45 UTC (permalink / raw)
  To: Per Bothner; +Cc: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 4891 bytes --]

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=#t
;; id=r
;; (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 => not defined
      (lambda ()
(eval x (interaction-environment))
#t))))))) ; eval suceeded => defined


;; #|kawa:86|# (define k 0)
;; #|kawa:87|# (let loop () (if (< k 4) (let () (display k) (newline) (<- k
(+ k 1)) (loop))))
;; if-defined : where=#t
;; id=k
;; 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=#t
;; id=k
;; 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=#t
;; id=s
;; 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=#t
;; id=s
;; 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=") (display where) (newline)
(display "id=") (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=#f
id=#<syntax:unknown file:19:72 k>
#<unspecified>
ice-9/boot-9.scm:1685:16: In procedure raise-exception:
In procedure +: Wrong type argument in position 1: #<unspecified>

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 => not defined
      (lambda ()
(eval x (interaction-environment))
#t))))))) ; eval suceeded => defined

(define-syntax if-defined
  (lambda (stx)
    (syntax-case stx ()
      ((_ id iftrue iffalse)
       (let ((where (defined-symbol? #'id))) ;;(quote id))))
(display "if-defined : where=") (display where) (newline)
(display "id=") (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=#f
id=expr2
(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 AM Per Bothner <per@bothner.com> 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/
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: how to know if a variable is defined
  2024-04-13 22:45   ` Damien Mattei
@ 2024-04-13 22:58     ` Damien Mattei
  2024-04-16  6:37       ` Damien Mattei
  0 siblings, 1 reply; 6+ messages in thread
From: Damien Mattei @ 2024-04-13 22:58 UTC (permalink / raw)
  To: Per Bothner; +Cc: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 6840 bytes --]

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 => not defined
#|.....9|#       (lambda ()
#|....10|# (eval x (interaction-environment))
#|....11|# #t))))))) ; eval suceeded => 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=") (display where) (newline)
#|.....18|# (display "id=") (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=#f
id=expr2
/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 AM Damien Mattei <damien.mattei@gmail.com>
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=#t
> ;; id=r
> ;; (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 => not defined
>       (lambda ()
> (eval x (interaction-environment))
> #t))))))) ; eval suceeded => defined
>
>
> ;; #|kawa:86|# (define k 0)
> ;; #|kawa:87|# (let loop () (if (< k 4) (let () (display k) (newline) (<-
> k (+ k 1)) (loop))))
> ;; if-defined : where=#t
> ;; id=k
> ;; 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=#t
> ;; id=k
> ;; 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=#t
> ;; id=s
> ;; 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=#t
> ;; id=s
> ;; 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=") (display where) (newline)
> (display "id=") (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=#f
> id=#<syntax:unknown file:19:72 k>
> #<unspecified>
> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
> In procedure +: Wrong type argument in position 1: #<unspecified>
>
> 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 => not defined
>       (lambda ()
> (eval x (interaction-environment))
> #t))))))) ; eval suceeded => defined
>
> (define-syntax if-defined
>   (lambda (stx)
>     (syntax-case stx ()
>       ((_ id iftrue iffalse)
>        (let ((where (defined-symbol? #'id))) ;;(quote id))))
> (display "if-defined : where=") (display where) (newline)
> (display "id=") (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=#f
> id=expr2
> (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 AM Per Bothner <per@bothner.com> 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/
>>
>

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: how to know if a variable is defined
  2024-04-13 22:58     ` Damien Mattei
@ 2024-04-16  6:37       ` Damien Mattei
  0 siblings, 0 replies; 6+ messages in thread
From: Damien Mattei @ 2024-04-16  6:37 UTC (permalink / raw)
  To: Per Bothner; +Cc: kawa mailing list

[-- Attachment #1: Type: text/plain, Size: 7493 bytes --]

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 AM Damien Mattei <damien.mattei@gmail.com>
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 => not defined
> #|.....9|#       (lambda ()
> #|....10|# (eval x (interaction-environment))
> #|....11|# #t))))))) ; eval suceeded => 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=") (display where) (newline)
> #|.....18|# (display "id=") (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=#f
> id=expr2
> /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 AM Damien Mattei <damien.mattei@gmail.com>
> 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=#t
>> ;; id=r
>> ;; (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 => not defined
>>       (lambda ()
>> (eval x (interaction-environment))
>> #t))))))) ; eval suceeded => defined
>>
>>
>> ;; #|kawa:86|# (define k 0)
>> ;; #|kawa:87|# (let loop () (if (< k 4) (let () (display k) (newline) (<-
>> k (+ k 1)) (loop))))
>> ;; if-defined : where=#t
>> ;; id=k
>> ;; 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=#t
>> ;; id=k
>> ;; 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=#t
>> ;; id=s
>> ;; 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=#t
>> ;; id=s
>> ;; 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=") (display where) (newline)
>> (display "id=") (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=#f
>> id=#<syntax:unknown file:19:72 k>
>> #<unspecified>
>> ice-9/boot-9.scm:1685:16: In procedure raise-exception:
>> In procedure +: Wrong type argument in position 1: #<unspecified>
>>
>> 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 => not defined
>>       (lambda ()
>> (eval x (interaction-environment))
>> #t))))))) ; eval suceeded => defined
>>
>> (define-syntax if-defined
>>   (lambda (stx)
>>     (syntax-case stx ()
>>       ((_ id iftrue iffalse)
>>        (let ((where (defined-symbol? #'id))) ;;(quote id))))
>> (display "if-defined : where=") (display where) (newline)
>> (display "id=") (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=#f
>> id=expr2
>> (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 AM Per Bothner <per@bothner.com> 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/
>>>
>>

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2024-04-16  6:38 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-10 21:49 how to know if a variable is defined Damien Mattei
2024-04-11  1:00 ` Per Bothner
2024-04-11  9:51   ` Lassi Kortela
2024-04-13 22:45   ` Damien Mattei
2024-04-13 22:58     ` Damien Mattei
2024-04-16  6:37       ` Damien Mattei

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).