Vector 如何将数字向量转换为整数?

Vector 如何将数字向量转换为整数?,vector,common-lisp,type-conversion,Vector,Common Lisp,Type Conversion,对于几个有趣的数学问题,我使用数字向量作为整数的表示。到目前为止,这对我来说还不错。现在我想把向量转换回整数。我没有找到任何合适的现成功能,因此我提出了以下功能: (defun vector->integer (vec) "Returns a given vector of digits as an integer." (loop :for digit :across vec :with number-string = "" :do (setf nu

对于几个有趣的数学问题,我使用数字向量作为整数的表示。到目前为止,这对我来说还不错。现在我想把向量转换回整数。我没有找到任何合适的现成功能,因此我提出了以下功能:

(defun vector->integer (vec)
  "Returns a given vector of digits as an integer."
  (loop :for digit :across vec
        :with number-string = ""
        :do (setf number-string
          (concatenate 'string number-string (write-to-string digit)))
        :finally (return (parse-integer number-string))))

它基本上实现了我想要的功能,但我发现将
向量
转换为
字符串
整数
有点麻烦。还有更有效的方法吗?

为什么不使用乘法而不是串接字符串呢

例如

或者更简单:

(reduce (lambda (a b) (+ (* 10 a) b)) vec)

您的代码更简单,编写效率更高,如下所示:

(defun vector->integer (vector)
  (parse-integer (map 'string #'digit-char vector)))

这个问题是关于代码效率的,你应该发布它。因为@TeMPOral已经回答了我的问题,我不会再问codereview,但下次会考虑。这确实是非常简洁的编码,但还需要从“vector”到“string”再到“integer”的转换。这不是效率低下吗?@MartinBuchmann:一个字符串和一个整数。您的代码创建了将字符串与单个字符串连接起来的字符串。它也在一个循环中这样做。这是低效的。假设向量有100个数字。您的代码创建带有0、1、2、3、4、。。。98,99,100长度。只保留最后一个。其他的都是垃圾。我的代码只创建了一个与输入向量长度相同的字符串,因为MAP的实现是半正常的。@MartinBuchman:如果将某个内容连接到列表或循环中的向量的末尾,那么很容易看出这将是低效的。通常,在循环中串联向量是无效的。通常,人们可以用相对简单的方法编写更高效的代码。通常也可以编写更高效的代码,但是代码可能看起来更复杂。我的代码肯定更糟糕,这不是我的观点。我的意思是,与时间的乘法解相比。无论如何,再次感谢您分享您的经验。@MartinBuchmann:没错。这就是为什么我写了这样的代码(从构造的字符串中读取数字)以更高效的方式编写。来自TeMPoral的代码使用不同的方法。
(defun vector->integer (vector)
  (parse-integer (map 'string #'digit-char vector)))