【问题标题】:Assignment in elisp [closed]elisp中的分配[关闭]
【发布时间】:2021-10-06 14:11:54
【问题描述】:

我正在努力学习 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) 不计算。

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

编辑

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

【问题讨论】:

  • 当我在*scratch* 中评估它时,这对我有用。您如何确定n 的值?
  • 我正在尝试做这样的事情:(defun rnd (n) (setq n (random n)) ...)
  • 并像这样调用 (rnd 100)
  • 您正在分配给函数的参数,这对您传递给函数的任何内容都没有影响。 (你期望(rnd 100)修改100的值吗?)

标签: emacs variable-assignment elisp


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我猜你使用let 是因为它定义了局部变量?为什么let后面的代码都在let里面?
  • @zeynel:因为ret没有在let之外定义
  • "list: (34126 16061 1041 276 218 115 9 0) steps: 8" 为什么 (random n) 有时会返回 0?我认为它应该停在1
  • @zeynel:阅读random 的文档。就是这样定义的。
猜你喜欢
  • 2011-11-18
  • 1970-01-01
  • 1970-01-01
  • 2019-06-28
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2012-10-26
  • 2018-06-08
相关资源
最近更新 更多