elisp 中的赋值

Assignment in elisp

我正在努力学习 elisp。我想使用 (random n) 然后 取 (random n) 的结果并用它来计算一个新的随机数 数,直到我们达到 1。

像这样:

(random 100)
99
(random 99)
51
(random 51)
24
(random 24)
11
(random 11)
3
(random 3)
2
(random 2)
1

如何将 n 的新值分配给 (random n)

(setq n (random n))

不起作用。这样给出一个常数,(random n)不计算

你能给我一个提示吗?我意识到这是一个新手问题。谢谢。

EDİT

(defun rnd (n)       
  (setq counter 0)
  (let ((ret ()))
            
    (while (< 1 n)
      
      (setq n (random n))
      (setq counter (+ counter 1))  
      (push n ret))
    
    
    (reverse ret))
  )

(format "list: %s \n steps: %s" (rnd 100000) counter)

您不能在函数内更改外部变量的值:

(defvar n 100)
(defun rnd (n)
  (setq n (random n)))

(rnd n) 不会 更改 n 的值,因为 rnd 会为 n 创建一个新绑定。

然而,这应该有效:

(defvar n 100)
(defun rnd ()
  (setq n (random n)))

或者你可以在 rnd:

中做一个循环
(defun rnd (n)
  (let ((ret ()))
    (while (< 1 n)
      (setq n (random n))
      (push n ret))
    ret))
(rnd 100)
==> (1 3 8 16 20 27 53)