首页 > 解决方案 > 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

如何分配nto的新值(random n)

(setq n (random n))

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

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

编辑

(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)

标签: emacsvariable-assignmentelisp

解决方案


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

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

(rnd n)不会更改 的值,因为为.nrndn

但是,这应该有效:

(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)

推荐阅读