是否有相当于Common Lisp在Racket的推动?

时间:2016-11-24 16:58:28

标签: lisp common-lisp racket

在Commons Lisp中有命令“push”:

(define (push x a-list)
  (set-box! a-list (cons x (unbox a-list))))

例如,它允许您将元素放在列表中。

在Racket中有这样的东西吗?

我尝试在文档中搜索,但找不到它。

我唯一发现的是一个名为Forth的包中的push命令,用于基于堆栈的计算。

1 个答案:

答案 0 :(得分:2)

push是一个宏。表达式(push 10 *var*)扩展为(setf *var* (cons 10 *var*))。你可以在racket / scheme中制作一个类似的宏:

(define-syntax push
  (syntax-rules ()
    ((_ expr var) 
     (set! var (cons expr var)))))

(define x '())
(push 10 x)
(push 20 x)
x ; ==> (20 10)

如果您将列表存储在一个框中,那么您也可以使其成为一个功能:

(define (push e box)
  (set-box! box (cons e (unbox box))))

(define x (box '()))
(push 10 x)
(push 20 x)
x ; ==> #&(20 10)