这是我在普通lisp中的第一个作业的一部分.
我们必须定义一个表示从0到100的任意10个随机整数的变量:我不确定这里要问的是什么.我应该写:(setf var1 '())
然后,我们必须定义一个函数,该函数生成一个包含10个随机整数的列表,并返回包含这些数字的列表.
这是我写的,但我一直把NIL作为我的输出.你知道代码有什么问题:
(setf *random-state* (make-random-state t))
(setf var1 '())
(defun randlist (var1)
(dotimes (i 10)
(setf temp (random 101))
(cons 'temp var1 ) ) )
Run Code Online (Sandbox Code Playgroud)
编写一个函数,返回一个包含10个随机整数的新列表:
(defun randlist ()
(let ((lst ()))
(dotimes (i 10)
(setf lst (cons (random 101) lst)))
lst))
Run Code Online (Sandbox Code Playgroud)
然后您可以将其结果分配给变量:
(defvar var1 (randlist))
Run Code Online (Sandbox Code Playgroud)
演示.
小智 7
您不需要*random-state*像这样初始化.无论如何,那是默认的.如果你有一个不同的随机数生成器实现,你需要初始化它.
尽管(setf whatever nil)可能会有效,但这不是您声明变量的方式.setf是一个用于为符号赋值的宏.通常,您首先创建符号然后分配给它们.如果您需要动态变量,您的选项是defparamter或defvar宏,例如:
(defparameter var1 nil)
(defvar var2 nil)
Run Code Online (Sandbox Code Playgroud)
您的函数randlist返回,nil因为这是dotimes宏返回的,这是函数中执行的最后一个表单.您可以将其更改为返回var1,但使用动态变量,尤其是这种方式并不是一个好的编码实践.从任务中听起来好像你被要求简单地编写一个返回十个整数列表的函数,不需要将它分配给函数外的动态变量.
(defun randlist ()
(loop for i from 0 below 10 collect (random 101)))
Run Code Online (Sandbox Code Playgroud)
也许是最简单的方法.但是还有很多其他的方法:)
只是为了好玩,这是另一种选择,但它并不是特别好.我希望它更短,但它不是真的:)
(defun random-list ()
(mapcar #'random (make-list 10 :initial-element 101)))
Run Code Online (Sandbox Code Playgroud)