| Paste number 66055: | Maybe this will work |
| Pasted by: | cky |
| 3 months, 3 days ago | |
| #guile | Context in IRC logs | |
| Paste contents: |
| (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: |
| (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: |
| (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: |
| (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: |
| (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: |
| (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: |
| (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)) |