在我的项目中,我有很多坐标需要处理,在 2D 情况下,我发现 的构建比和(cons x y)更快。(list x y)(vector x y)
但是,我不知道如何扩展cons到 3D 或更进一步,因为我没有找到类似cons3. tuplecommon-lisp 中有快速的解决方案吗?
为了便于说明,我做了以下测试:
* (time (loop repeat 10000 do (loop repeat 10000 collect (cons (random 10) (random 10)))))
Evaluation took:
7.729 seconds of real time
7.576000 seconds of total run time (7.564000 user, 0.012000 system)
[ Run times consist of 0.068 seconds GC time, and 7.508 seconds non-GC time. ]
98.02% CPU
22,671,859,477 processor cycles
3,200,156,768 bytes consed …Run Code Online (Sandbox Code Playgroud) 我们可以定义函数f,g像这样:
f :: [a] -> [a] -> [a]
f = (++)
g :: [a] -> [a] -> [a]
g = zipWith (+)
Run Code Online (Sandbox Code Playgroud)
双方f并g采取两个列表作为参数,并返回一个新的列表,但它们是不同的:f返回一个列表较长,其长度的输入的总和,同时g处理列出与相同的长度.如何计算出Haskell?
我正在使用gsll它antik进行一些科学计算,我发现antik不重用无法访问的对象并且总是分配新的对象,这使我的程序变慢.
例如,有一个名为lu-invertin 的函数gsll,它计算给定矩阵的反转,并且可以指定可选的目标对象.如果我指定目标对象,lu-invert则会将结果存储到该对象中.否则,lu-invert将分配一个新对象来存储结果.
我比较了两种情况的时间消耗,前者比后者快得多.但是,始终为这些功能指定目标对象非常不方便.
我想知道是否有一种方法可以自动回收和重用无法访问的对象,而不是总是分配新的对象.
我想一个宏my-macro可以扩展到1 2 3不是(1 2 3),这样
(list (my-macro) 4 5) -> (1 2 3 4 5)
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我有很多这样的代码块:
try:
a = get_a()
try:
b = get_b()
# varying codes here, where a and b are used
finally:
if b:
cleanup(b)
finally:
if a:
cleanup(a)
Run Code Online (Sandbox Code Playgroud)
我希望写一些像这样的魔术代码:
some_magic:
# varying codes here, where a and b are also available
Run Code Online (Sandbox Code Playgroud)
这可能吗?
我正在使用Common Lisp,我有多个函数使用相同类型的数据,我declare用来指定这样的符号类型:
(defun foo (x)
(declare (type single-float x))
...)
(defun bar (x y)
(declare (type single-float x y))
...)
Run Code Online (Sandbox Code Playgroud)
现在,我想存储single-float到像一个自定义符号changable-float,这样我可以很容易地改变所有类型的这些功能(例如,从single-float到double-float).我试过这些代码,但它不起作用:
(defvar changeable-float 'single-float)
(defun foo (x)
(declare (type changeable-float x))
...)
(defun bar (x y)
(declare (type changeable-float x y))
...)
Run Code Online (Sandbox Code Playgroud)
我该如何实现这个想法?