因此, mul 和 imul 指令都将机器字相乘,并将结果和溢出都存储在某些寄存器中(例如参见https://c9x.me/x86/html/file_module_x86_id_210.html)。我正在尝试编写一个可以完全使用此信息并返回 2 个值的 vop。这可能吗?我找不到有关如何使 vop 返回多个值的任何信息。如果有人可以展示整个事情的样子,我也会很感激。
编辑:所以我想出了一些东西,但它仍然不够好。我会把它贴在这里,然后解释问题。
(defpackage #:fixmul
(:use #:CL)
(:export #:fixmul))
(in-package #:fixmul)
(sb-c:defknown fixmul (fixnum fixnum) (values fixnum fixnum &optional)
(sb-c:foldable sb-c:flushable sb-c:movable)
:overwrite-fndb-silently t)
(in-package #:sb-vm)
(define-vop (fixmul:fixmul)
(:policy :fast-safe)
(:translate fixmul:fixmul)
(:args (x :scs (signed-reg) :target eax)
(y :scs (signed-reg signed-stack)))
(:arg-types fixnum fixnum)
(:args-var args)
(:temporary (:sc signed-reg :offset eax-offset :target quo
:from (:argument 0) :to (:result 0)) eax)
(:temporary (:sc signed-reg :offset edx-offset :target rem
:from (:argument …Run Code Online (Sandbox Code Playgroud) 我发现,在CL哈希表中有一个类型HASH-TABLE(令人惊讶).但是,矢量可以只是矢量,但也可以进一步指定为(矢量编号12).
散列表似乎很自然地有一个列表类型,比如,(hash-table number cons)或者其他东西,但它似乎不起作用,我找不到任何对它的引用.有什么建议?
首先我将描述该任务:
我需要:
__m128i。uint16_t值(可能使用_mm_movemask_epi8先然后只是&)。blend结果计算初始值。所以问题是,正如您可能已经猜到的那样,混合接受__m128i作为掩模,而我将拥有uint16_t. 因此,我要么需要某种反向指令,_mm_movemask_epi8要么完全做其他事情。
有些观点——我可能无法将该uint16_t值更改为其他类型,这很复杂;我在 SSE4.2 上这样做,所以没有 AVX;这里有一个类似的问题How to Perform the inverse of _mm256_movemask_epi8 (VPMOVMSKB)? 但这是关于 avx 的,我对此非常缺乏经验,所以我无法采用该解决方案。
PS:我可能也需要为手臂做这件事,希望得到任何建议。
如何make-array在SBCL工作?在C++中是否有一些等价物new和delete运算符,或者它是否是其他东西,也许是汇编程度?
我偷看了源头,却什么都不懂.
我试图做一个简单的合并排序功能.几乎完成了代码,但是:
m_sort :: (Ord a) => [a] -> [a]
m_sort d
| d == [] = []
| d == [a] = [a]
| otherwise = merge (m_sort (fst $ split d)) (m_sort (snd $ split d))
Run Code Online (Sandbox Code Playgroud)
出于某种原因,我得到了Haskell_training.hs:137:21: error: Variable not in scope: a.排除| d == [a] = [a]导致好的编译,但没有它就无法工作.我没有看到模式匹配有一些非常明显的问题吗?
从标准描述中很难理解,所以:
例如,我试图将某个列表 (ls) 的第 k 个位置设置为特定值。甚至有我自己的功能,可以访问第 k 个 elt。
(defun kth-elt (lst k)
(cond ((> 0 k) nil)
((equal 0 k) (car lst))
((< 0 k) (kth-elt (cdr lst) (- k 1))))).
Run Code Online (Sandbox Code Playgroud)
还创建了一个函数来更新该值。
(defun kth-upd (lst k new)
(cond ((> 0 k) nil)
((equal 0 k) (setf (car lst) new))
((< 0 k) (kth-upd (cdr lst) (- k 1) new))))
Run Code Online (Sandbox Code Playgroud)
现在我实际上可以使用它,但我想了解它和 DEFSETF 之间的区别。另外我还是不明白。如何“教”defsetf 使用这些。谢谢帮助。
我正在尝试编写一个宏,它会自动为所有插槽写一个类的加速器.我想出了这个
(defmacro defacc (class)
(loop for name in (mapcar #'slot-definition-name
(class-slots (class-of (make-instance `,class))))
do
`(defun ,name (,class)
(slot-value ,class ',name))))
Run Code Online (Sandbox Code Playgroud)
但它并没有定义任何功能(无环,它适用于单功能和单插槽名字.我不明白其中S的问题.我也试过(class-of (make-instance 'class))和(class-of ',class),似乎仍然没有作用.
PS我没有忘记实际用我的类写这个宏.
功能的时间复杂度是gethash多少?例如,在用于map搜索的c ++中O(log(n)),虽然unordered_map它是O(1).这两件事都是用描述写的,但我gethash在Lisp中找不到任何这样的参考.
实际上,这扩展到所有标准库函数.哪里可以找到它们的复杂性,或者我可以吗?谈论sbcl,如果重要的话.
我正在尝试编写一个(更高阶函数),它接受一个向量和一个函数,并根据该函数进行二进制搜索,即如果它返回-1,我们需要更低,为1 - 更高,为0我们找到了合适的地方.我想出了类似的东西,但似乎我把函数作为参数传递出错了:
(defun bin-search (ls fpred)
(let ((l (length ls))
(x (aref ls (floor (length ls) 2))))
(labels (binsearch (ls fpred l m)
(case (funcall #'fpred (aref ls m))
(-1 (binsearch (ls fpred l (floor (- m l) 2))))
(0 (return-from binsearch m))
(1 (binsearch (ls fpred m (+ m (floor (- m l) 2)))))))
(binsearch ls fpred 0 l))))
Run Code Online (Sandbox Code Playgroud)
编译器说变量FPRED已定义但从未使用过.怎么了?
我正在尝试学习如何在lisp中进行类型声明.我发现aref导致问题:
(defun getref (seq k)
(declare (optimize (speed 3) (safety 0)))
(declare (type (vector fixnum *) seq) (type fixnum k))
(aref seq k))
Run Code Online (Sandbox Code Playgroud)
编译,它说:
; in: DEFUN GETREF
; (AREF MORE-LISP::SEQ MORE-LISP::K)
; ==>
; (SB-KERNEL:HAIRY-DATA-VECTOR-REF ARRAY SB-INT:INDEX)
;
; note: unable to
; avoid runtime dispatch on array element type
; due to type uncertainty:
; The first argument is a (VECTOR FIXNUM), not a SIMPLE-ARRAY.
;
; compilation unit finished
; printed 1 note
Run Code Online (Sandbox Code Playgroud)
所以在其他所有函数中,我想使用aref(而且我这样做,因为我需要可调整的向量),这也会发生.我如何解决它?
有没有办法(使用循环或迭代,无关紧要)向后迭代序列?
除了(loop for i downfrom 10 to 1 by 1 do (print i))使用索引,需要长度,或(loop for elt in (reverse seq))需要反转序列(甚至比第一个选项更糟糕).