如何以相反的方式使用 CONS?
How can I use CONS in reverse way?
通常,我们将两个参数传递给cons
,在RACKET
eg:
(cons 23 '(1 2 3))
输出'(23 1 2 3)
是否有任何程序可以执行以下操作
(procedure '(1 2 3) 23)
=> '(1 2 3 23)
试试这个:
(append '(1 2 3) '(23))
=> '(1 2 3 23)
这对于追加单个元素来说很好。如果您打算在末尾重复添加许多元素,最好在头部 cons
所有内容,然后在完成后 reverse
列表。为什么?因为使用 append
构建输出列表会很快退化为 O(n^2)
解决方案(参见:Schlemiel the Painter's algorithm)
在 Lisp/Scheme/Racket 中,如果您需要一个过程,编写它会使它与内置过程在很大程度上没有区别:
#lang racket
(define (procedure a-list an-atom)
(cond
[(not (list? a-list)) (error "procedure: first argument not a list")]
[(pair? an-atom) (error "procedure: second argument is a list")]
[else
(append a-list (list an-atom))]))
然后使用它:
> (procedure '(1 2 3) 23)
'(1 2 3 23)
通常,我们将两个参数传递给cons
,在RACKET
eg:
(cons 23 '(1 2 3))
输出'(23 1 2 3)
是否有任何程序可以执行以下操作
(procedure '(1 2 3) 23)
=> '(1 2 3 23)
试试这个:
(append '(1 2 3) '(23))
=> '(1 2 3 23)
这对于追加单个元素来说很好。如果您打算在末尾重复添加许多元素,最好在头部 cons
所有内容,然后在完成后 reverse
列表。为什么?因为使用 append
构建输出列表会很快退化为 O(n^2)
解决方案(参见:Schlemiel the Painter's algorithm)
在 Lisp/Scheme/Racket 中,如果您需要一个过程,编写它会使它与内置过程在很大程度上没有区别:
#lang racket
(define (procedure a-list an-atom)
(cond
[(not (list? a-list)) (error "procedure: first argument not a list")]
[(pair? an-atom) (error "procedure: second argument is a list")]
[else
(append a-list (list an-atom))]))
然后使用它:
> (procedure '(1 2 3) 23)
'(1 2 3 23)