Paste number 66055: Maybe this will work

Index of paste annotations: 1 | 2 | 3 | 4 | 5 | 6

Paste number 66055: Maybe this will work
Pasted by: cky
3 months, 3 days ago
#guile | Context in IRC logs
Paste contents:
Raw Source | XML | Display As
(define (save f)
  (let loop ((env (filter pair? (procedure-environment f)))
             (src (procedure-source f))
)

    (if (null? env)
        (begin
         (write src)
         (newline)
)

        (loop (cdr env)
              `(let ,(zip (caar env) (cdar env)) ,src)
)
)
)
)

Annotations for this paste:

Annotation number 1: This will work better :-)
Pasted by: cky
3 months, 3 days ago
Context in IRC logs
Paste contents:
Raw Source | Display As
(define (save f)
  (let loop ((env (filter pair? (procedure-environment f)))
             (src (procedure-source f))
)

    (if (null? env)
        (begin
         (write src)
         (newline)
)

        (let ((keys (caar env))
              (vals (cdar env))
)

          (loop (cdr env)
                `(let ,((if (list? keys) zip list) keys vals) ,src)
)
)
)
)
)

Annotation number 2: this works too :)
Pasted by: Kayden
3 months, 3 days ago
Context in IRC logs
Paste contents:
Raw Source | Display As
(use-modules (srfi srfi-1))
(define (save f)
  (let ((env (filter pair? (procedure-environment f)))
        (src (procedure-source f))
)

    (write `(let ,(concatenate (map (lambda (p) (if (list? p) (zip (car p) (cdr p)) (list (list (car p) (cdr p))))) env)) ,src))
    (newline)
)
)


;; tests:
(define (foo x y) (lambda (a b) (lambda (c d) (+ x y a b c d))))
(define bar ((foo 1 2) 3 4))

;; guile> (save (let ((z 15)) (let ((y 14)) (lambda (x) (+ x y)))))
;; (let ((y 14) (z 15)) (lambda (x) (+ x y)))
;; guile> (save (let ((y 14)) (lambda (x) (+ x y))))
;; (let ((y 14)) (lambda (x) (+ x y)))
;; guile> (save (let ((y 14) (z 15)) (lambda (x) (+ x y))))
;; (let ((z 15) (y 14)) (lambda (x) (+ x y)))
;; guile> (save bar)
;; (let ((a 3) (b 4) (x 1) (y 2)) (lambda (c d) (+ x y a b c d)))

Annotation number 3: Much better
Pasted by: cky
3 months, 3 days ago
Context in IRC logs
Paste contents:
Raw Source | Display As
(define (save f)
  (let loop ((env (filter pair? (procedure-environment f)))
             (src (procedure-source f))
)

    (if (null? env)
        (begin
         (write src)
         (newline)
)

        (let ((keys (caar env))
              (vals (cdar env))
)

          (loop (cdr env)
                `(let ,(if (list? keys) (zip keys vals)
                                        `((,keys ,vals))
)
,src
)
)
)
)
)
)

Annotation number 4: A filter-less version :-)
Pasted by: cky
3 months, 3 days ago
Context in IRC logs
Paste contents:
Raw Source | Display As
(define (save f)
  (let loop ((env (procedure-environment f))
             (src (procedure-source f))
)

    (cond
     ((null? env)
      (write src)
      (newline)
)

     ((pair? (car env))
      (let ((keys (caar env))
            (vals (cdar env))
)

        (loop (cdr env)
              `(let ,(if (list? keys) (zip keys vals)
                                      `((,keys ,vals))
)
,src
)
)
)
)

     (else
      (loop (cdr env) src)
)
)
)
)

Annotation number 5: a version using fold
Pasted by: Kayden
3 months, 2 days ago
Context in IRC logs
Paste contents:
Raw Source | Display As
(define (save f)
  (let ((env (filter pair? (procedure-environment f)))
        (src (procedure-source f))
)

    (write (fold (lambda (bs acc)
                    (cond
                      ((list? bs) `(let ,(zip (car bs) (cdr bs)) ,acc))
                      ((pair? bs) `(let ((,(car bs) ,(cdr bs))) ,acc))
                      (else acc)
)
)

                 src env
)
)

    (newline)
)
)

Annotation number 6: Filterless origami :-)
Pasted by: cky
3 months, 2 days ago
Context in IRC logs
Paste contents:
Raw Source | Display As
(define (save f)
  (write (fold (lambda (bs acc)
                  (cond
                    ((list? bs) `(let ,(zip (car bs) (cdr bs)) ,acc))
                    ((pair? bs) `(let ((,(car bs) ,(cdr bs))) ,acc))
                    (else acc)
)
)

               (procedure-source f)
               (procedure-environment f)
)
)

  (newline)
)

Colorize as:
Show Line Numbers
Index of paste annotations: 1 | 2 | 3 | 4 | 5 | 6

Lisppaste pastes can be made by anyone at any time. Imagine a fearsomely comprehensive disclaimer of liability. Now fear, comprehensively.