我正在编写一些获得一个集合长度列表的guile代码,我需要为列表中的每个元素定义一个变量。现在,我要做这样的事情:
(define (foo l)
(let ((e-1 (car l))
(e-2 (cadr l))
(e-2 (caddr l))
; ...
(e-n (list-ref (- n 1)
l)))
(compute)))这太乏味了。不管怎样,我可以做这样的事吗?
(define (foo l)
(symbol-def e-1 e-2 e-3 e-4 e-n l)
(compute))编辑:提出了更多针对欺诈的问题。
发布于 2014-01-24 02:27:41
具体到Guile,我找到了冰-9匹配模块,它有以下形式:
(match lst
((pattern) expr))示例:
(use-modules (ice-9 match))
(let ((l '(test foo bar)))
(match l
((head second third)
second)))
; returns `foo`发布于 2022-07-05 18:26:40
使用多个值是将已知长度列表中的元素绑定到变量的一种方法:
;;; Using SRFI-8 receive syntax
(use-modules (ice-9 receive))
(define (foo l)
(receive (e-1 e-2 e-3 e-4) (apply values l)
(format #t "~S~%~S~%~S~%~S~%" e-1 e-2 e-3 e-4)))
(foo '(1 2 3 4))
;;; Using SRFI-11 let-values syntax
(use-modules (srfi srfi-11))
(define (foo2 l)
(let-values (((e-1 e-2 e-3 e-4) (apply values l)))
(format #t "~S~%~S~%~S~%~S~%" e-1 e-2 e-3 e-4)))
(foo2 '(a b c d))
;;; Using R5RS call-with-values
(define (foo3 l)
(call-with-values
(lambda () (apply values l))
(lambda (e-1 e-2 e-3 e-4)
(format #t "~S~%~S~%~S~%~S~%" e-1 e-2 e-3 e-4))))发布于 2022-10-19 18:42:56
另一件值得一提的事情是定义--价值。
(define (bar l)
(define-values (a b c d) (apply values l))
(compute a b c d))https://stackoverflow.com/questions/21323022
复制相似问题