unofficial mirror of guile-user@gnu.org 
 help / color / mirror / Atom feed
* adding #' syntax and my cloned macro no more works like original....
@ 2024-05-09  9:07 Damien Mattei
  2024-05-09  9:16 ` Maxime Devos
  0 siblings, 1 reply; 3+ messages in thread
From: Damien Mattei @ 2024-05-09  9:07 UTC (permalink / raw)
  To: guile-user

hello,

i having a little horrific bug in one of my macro. In fact i have 2 macro :
<- that do all the job and another alias ←

till now the ← acted as a perfect clone of <- wihtout having all the code,
being defined as:

(define-syntax ← ;; under Linux this symbol can be typed with the
   ;; combination of keys: Ctrl-Shift-u 2190 where 2190 is the unicode of
left arrow

   (syntax-rules ()

     ((_ var ...) (<- var ...))))

but now that i added a few 'syntax' to <- , i have errors using ← , some
bindings become unbinded:

error is sort of :

ice-9/boot-9.scm:1685:16: In procedure raise-exception:
Unbound variable: lin

Entering a new prompt.  Type `,bt' for a backtrace or `,q' to continue.
scheme@(guile-user) [1]> ,q

appearing in:

{iepi[{lin + 1} 0] ← vct-prime-implicants[lin]}

if i replace it with:

{iepi[{lin + 1} 0] <- vct-prime-implicants[lin]}

all works again.

backtrace is of no help, sort of:
scheme@(guile-user) [1]> ,bt
In /Users/mattei/library-FunctProg/guile/logiki+.scm:
  2848:18  5 (_ #<continuation 1073b2380>)
   743:23  4 (infix-symb-min-dnf _)
  1777:41  3 (minimal-dnf _)
  2707:38  2 (_ _)
  2546:18  1 (identify-essential-prime-implicants _ _)
In ice-9/boot-9.scm:
  1685:16  0 (raise-exception _ #:continuable? _)

i know it is a macro problem, not in procedures,and it is since i added
some #' syntax to optimize code...

a solution would be to duplicate all the code from <- into ← but this is
stupid.

how can i change ← to act perfectly as <- ?

i'm afraid to post it but i think i must post the code of <- to get any
help about that:

;; {s <+ (string-append "abcdefgh")};; "abcdefgh";; > {s[2 * 3 - 4 $ 2
* 3 + 1 $ 2 * 4 - 6] <- "0000"};; "ab0d0f0h"
;; $bracket-apply$ is from SRFI 105  bracket-apply is an argument of
the macro(define-syntax <-

  (lambda (stx)

    (syntax-case stx ()


      ;; silly case
      ((_ ( ) expr)
       #'(void)) ;; void is not portable ;'())

      ;; one value in values !
      ;; > {(x) <- (values 7)}
      ;; > x
      ;; 7
      ((_ (var) expr)

       #'(set!-values-plus (var) expr))



      ;; example: {a[4] <- 7}
      ;; $bracket-apply$ is from SRFI 105  bracket-apply is an
argument of the macro

      ((_ (brket-applynext container index ...) expr)  ; possible to
have NO index :
					; minimal form is (_ (brket-applynext container) expr)

       ;; We will let the second $bracket-apply$ be executed and
forbid the execution of first $bracket-apply$.
       (cond ((equal? (quote $bracket-apply$next) (syntax->datum
#'brket-applynext))  ;; already parsed and optimised by parser

	      #'(assignmentnext container expr index  ...)) ; possible to have NO index


	     ;; integrated curly-infix of guile (no parsing) at REPL
	     ((equal? (quote $bracket-apply$) (syntax->datum #'brket-applynext))

	      (display "<- : (syntax->datum #'(index ...)) = ") (display
(syntax->datum #'(index ...))) (newline)
	      (display "<- : (number? (car (syntax->datum #'(index ...)))) =
") (display (number? (car (syntax->datum #'(index ...))))) (newline)
	
	      ;; parse arguments at posteriori here:
	      (with-syntax ((parsed-args (datum->syntax stx ; #f
							(cons #'list
							      (optimizer-parse-square-brackets-arguments-lister
(syntax->datum #'(index ...)))))))
			   (display "<- : #'parsed-args=") (display #'parsed-args) (newline)
			   (display "<- :  (syntax->datum #'parsed-args)=") (display
(syntax->datum #'parsed-args)) (newline)
	
			   ;;(case (length (syntax->datum #'(index ...)))
			   (case (length (cdr (syntax->datum #'parsed-args)))

			     ;; 0 argument in []
			     ;; T[]
			     ;; {v[] <- #(1 2 3)}
			     ;; > v
			     ;;'#(1 2 3)
			     ((0)
			      #'(assignment-argument-0 container expr))  ; possible to have NO index

			     ;; 1 argument in [ ]
			     ;; T[index]
			     ((1)
			      #'(assignment-argument-1 container
						       (first parsed-args)
						       expr))

			     ;; 2 arguments in [ ]
			     ;; ex: T[i1 :] , T[: i2], T[i1 i2] , T[: :]
			     ;; {#(1 2 3 4 5)[inexact->exact(floor(2.7)) :]}
			     ;; '#(3 4 5)
			     ((2)
			      #'(assignment-argument-2 container
						       (first parsed-args)
						       (second parsed-args)
						       expr))

			     ;; 3 arguments in [ ]
			     ;; T[i1 : i2] , T[i1 i2 i3] , T[: : s]
			     ((3)
			      #'(assignment-argument-3 container					
						       (first parsed-args)
						       (second parsed-args)
						       (third parsed-args)
						       expr))
			
			     ;; 4 arguments in [ ]
			     ;; T[: i2 : s] , T[i1 : : s] , T[i1 : i3 :] , T[i1 i2 i3 i4]
			     ((4)
			      #'(assignment-argument-4 container
						       (first parsed-args)
						       (second parsed-args)
						       (third parsed-args)
						       (fourth parsed-args)
						       expr))

			     ;; 5 arguments in [ ]
			     ;; T[i1 : i3 : s] , T[i1 i2 i3 i4 i5]
			     ((5)
			      #'(assignment-argument-5 container
						       (first parsed-args)
						       (second parsed-args)
						       (third parsed-args)
						       (fourth parsed-args)
						       (fifth parsed-args)
						       expr))

			     ;; more than 5 arguments in [ ]
			     ;; T[i1 i2 i3 i4 i5 i6 ...]
			     (else ; case
			      #'(assignment-argument-6-and-more container parsed-args expr)))))

	     (else ; cond
	      #'(set!-values-plus (brket-applynext container index ...)
expr)))) ; warning: the argument's names does not match the use



      ;;(<- x 5)
      ((_ var expr)

       #'(set! var expr))


      ;; (declare x y z t)
      ;; {x <- y <- z <- t <- 7}
      ;; 7
      ;; (list x y z t)
      ;; (7 7 7 7)

      ;; > (require srfi/25)
      ;; > {I <- (make-array (shape 0 4 0 4))}
      ;; #<array:srfi-9-record-type-descriptor>
      ;; > {I[0 0] <- I[1 1] <- I[2 2] <- I[3 3] <- 1}
      ;; 1
      ;; > {I[0 0]}
      ;; 1
      ;; > {I[0 1]}
      ;; 0
      ;; > I
      ;; #<array:srfi-9-record-type-descriptor>

      ;; > (declare a b c d)
      ;; > {(a b) <- (c d) <- (values 5 7)}
      ;; > a
      ;; 5
      ;; > b
      ;; 7
      ;; > c
      ;; 5
      ;; > d
      ;; 7

      ;; without declare:
      ;; > {(a b) <- (c d) <- (values 5 7)}
      ;; > (list a b c d)
      ;; '(5 7 5 7)
      ((_ var var1 ... expr)


       #'(begin ;; i do not do what the syntax says (assignation not
in the good order) but it gives the same result
	   ;;(display "<- : case (_ var var1 ... expr)") (newline)
	
	   (define return-values-of-expr (create-return-values expr))
	   (<- var (return-values-of-expr))
	   ;;(display "<- : case : passed (<- var expr)") (newline)
	   ;;(display "<- : case : var=") (display var) (newline)
	
	   (<- var1 (return-values-of-expr))
	   ...))


      )))




Best regards,
Damien


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

* RE: adding #' syntax and my cloned macro no more works like original....
  2024-05-09  9:07 adding #' syntax and my cloned macro no more works like original Damien Mattei
@ 2024-05-09  9:16 ` Maxime Devos
  2024-05-09 22:04   ` Damien Mattei
  0 siblings, 1 reply; 3+ messages in thread
From: Maxime Devos @ 2024-05-09  9:16 UTC (permalink / raw)
  To: Damien Mattei, guile-user

The code you posted is too long – if you want me to have a look at it, minimize it first.

Best regards,
Maxime Devos


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

* Re: adding #' syntax and my cloned macro no more works like original....
  2024-05-09  9:16 ` Maxime Devos
@ 2024-05-09 22:04   ` Damien Mattei
  0 siblings, 0 replies; 3+ messages in thread
From: Damien Mattei @ 2024-05-09 22:04 UTC (permalink / raw)
  To: Maxime Devos; +Cc: guile-user

sorry i can not minimize the code, i even removed all sub-procedures called.

in fact it is a general question : "how to clone a macro?" without brutally
copying it all in another define-syntax.

example cloning a <- macro to call it with  the name ←

i tried to recopy only the pattern (see other mail) but it fails... but
worked (of course) if i recopy all the code.

best regards
damien

On Thu, May 9, 2024 at 11:16 AM Maxime Devos <maximedevos@telenet.be> wrote:

> The code you posted is too long – if you want me to have a look at it,
> minimize it first.
>
>
>
> Best regards,
>
> Maxime Devos
>


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

end of thread, other threads:[~2024-05-09 22:04 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-05-09  9:07 adding #' syntax and my cloned macro no more works like original Damien Mattei
2024-05-09  9:16 ` Maxime Devos
2024-05-09 22:04   ` 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).