我有一个关于C中的二维数组的问题.我现在知道(从直接编译器经验)我不能像这样一维数组初始化这样的数组:
int multi_array[][] = {
{1,2,3,4,5},
{10,20,30,40,50},
{100,200,300,400,500}
};
> compiler output:
gcc -o arrays arrays.c
arrays.c: In function ‘main’:
arrays.c:8:9: error: array type has incomplete element type
Run Code Online (Sandbox Code Playgroud)
最接近的解决方案是明确提供列数如下:
int multi_array[][5] = {
{1,2,3,4,5},
{10,20,30,40,50},
{100,200,300,400,500}
};
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果不明确地提供数字(这毕竟编译器应该能够推断自己),它可以整齐地完成吗?我不是在谈论手动构建它malloc
或者是什么,而是与我尝试的东西接近.另外,对C编译器有所了解的人可以从低级别的角度解释为什么我的初始尝试不起作用吗?
我使用plain gcc
而没有非标准选项来编译代码.
谢谢
我在Q#中有一个用例,其中有一个量子位寄存器qs
,需要将CNOT
除第一个量子位之外的每个量子位都应用门,并使用第一个作为控制。使用for
循环,我可以做到以下几点:
for (i in 1..Length(qs)-1) {
CNOT(qs[0], qs[i]);
}
Run Code Online (Sandbox Code Playgroud)
现在,我想给它一个更实用的味道,并尝试做类似的事情:
ApplyToEach(q => CNOT(qs[0], q), qs[1..Length(qs)-1]);
Run Code Online (Sandbox Code Playgroud)
Q#编译器不接受这样的表达式,通知我它遇到了意外的代码片段。就我的口味而言,这还不太丰富。一些文档声称Q#支持匿名功能a'la C#,因此是上面的尝试。有人可以指出我在Q#中正确使用lambda还是消除我的错误信念?
我有一个关于在 Emacs 中使用 的问题M-x man。我一直在使用 Tramp,并且远程服务器上安装的程序通常与我的本地设置有很大不同。我发现调用M-x man涉及在本地计算机上查找相关的联机帮助页。有没有办法指示它使用Tramp另一边的环境?
我知道有一个 Elisp 变量tramp-remote-process-environment
,我尝试为其添加一个条目MANPATH
,但它似乎不起作用(恐怕这是因为我将它放在表单中/usr/share/man
而不是/scpc:user@host:/usr/share/man
,但我想要的是一个通用的解决方案在所有远程主机上工作)。有任何想法吗?
我最近一直在Emacs次要模式下工作,其部分功能是在单独的缓冲区中显示图像。到目前为止,我一直在使用这样的函数:
(defun create-buffer-with-image (name)
(let ((buffer (generate-new-buffer name))
(image (get-svg-for-kanji-code name)))
(switch-to-buffer buffer)
(turn-on-iimage-mode)
(iimage-mode-buffer t)
(insert-image image)))
Run Code Online (Sandbox Code Playgroud)
并且会产生一个缓冲区,并以图像作为参数传递,但是关闭缓冲区需要点击C-x k和Return,这在一段时间后开始变得很麻烦。简化关闭此类瞬态缓冲区的方法是对该kill-this-buffer
函数进行键绑定,但是它必须是特定于缓冲区的,以便不弄乱其他任何东西。问题是如何通过创建缓冲区来进行这种绑定。
我正在为人们学习日语的Emacs模式。重点是通过运行一组函数提取点处的字符(如果它是日语字符)并显示具有笔划顺序的图像,来帮助他们学习各种日语字符(尤其是汉字)的笔划顺序。我已经解决了几乎所有细节,但是我对显示图像有疑问。我希望能够create-image
在定位于的弹出菜单中显示图像对象(由获得)。有任何提示吗?另外,我想创建一个显示图像的新临时缓冲区。我已经尝试过使用insert-image
image对象,但是在结果缓冲区中看到的只是一个应该放置图像的空矩形。如何制作可见图像的缓冲区?任何帮助,不胜感激。
我在Common Lisp中有另一个涉及自引用的问题.我在Stack Exchange上发现了一个线程,它提出了编写最短程序的问题,该程序将打印程序源代码中不存在的所有可打印ASCII字符.这让我想到如何解决Common Lisp中的问题.我遇到了两个问题 - 一个可能是微不足道的,另一个更棘手:
首先是编写CL脚本的情况,例如从#!/usr/bin/env sbcl --script
.我认为通过*posix-argv*
我可以访问所有命令行参数,包括被调用脚本的名称.我也寻找相当于Bash $0
但却找不到.最终对我有用的是这个丑陋的Bash-ified SBCL脚本,它明确传递$0
给SBCL并从那里继续:
#!/bin/bash
#|
sbcl --script $0 $0
exit
|#
(defun file-string (path)
(with-open-file (stream path)
(let ((data (make-string (file-length stream))))
(read-sequence data stream)
data)))
(let* ((printable (mapcar #'code-char (loop for i from #x20 to #x7e collect i)))
(absent (set-difference
printable
(coerce (file-string (cadr *posix-argv*)) 'list))))
(print (coerce absent 'string)))
Run Code Online (Sandbox Code Playgroud)
关于这一点我的问题是:你能否想到任何方式这样做而不依赖于Bash提供相关论点?或者,更简单地说:是否有CL(特别是SBCL)相当于$0
?
现在是我完全困惑的部分.在采用上面的脚本方法之前,我尝试以更加面向REPL的方式实现此目标.基于此线程中的&whole
说明符defmacro
和注意事项,我试图从参数中获取宏的名称,并以某种方式"读入"其源代码.我完全不知道该怎么做.所以简而言之:给定宏的名称,我能以某种方式获得定义它的形式吗?我正在讨论通用解决方案,而不是解析REPL历史. …
我正在使用Common Lisp进行一些数值计算,我需要计算具有给定数值系数的几个向量的线性组合.我正在重写一段Fortran代码,这可以通过以下方式完成res = a1*vec1 + a2*vec2 + ... + an*vecn
.我最初接受CL只是简单地写每次:
(map 'vector
(lambda (x1 x2 ... xn)
(+ (* x1 a1) (* x2 a2) ... (* xn an)))
vec1 vec2 ... vecn)
Run Code Online (Sandbox Code Playgroud)
但我很快就注意到这种模式会一遍又一遍地重复出现,所以开始编写一些代码来抽象它.因为向量的数量以及因此lambda参数的数量会因地而异,所以我认为需要一个宏.我想出了以下内容:
(defmacro vec-lin-com (coefficients vectors &key (type 'vector))
(let ((args (loop for v in vectors collect (gensym))))
`(map ',type
(lambda ,args
(+ ,@(mapcar #'(lambda (c a) (list '* c a)) coefficients args)))
,@vectors)))
Run Code Online (Sandbox Code Playgroud)
宏扩展表达式:
(vec-lin-com (10 100 1000) (#(1 2 3) #(4 5 6) #(7 8 …
Run Code Online (Sandbox Code Playgroud) 我一直在阅读Olin Shivers的一篇名为Stylish Lisp编程技术的文章,并发现那里的第二个例子(标有"Technique n-1")有点令人费解.它描述了一个自修改宏,如下所示:
(defun gen-counter macro (x)
(let ((ans (cadr x)))
(rplaca (cdr x)
(+ 1 ans))
ans))
Run Code Online (Sandbox Code Playgroud)
它应该将其调用形式作为参数x
(即(gen-counter <some-number>)
).这样做的目的是能够做到这样的事情:
> ;this prints out the numbers from 0 to 9.
(do ((n 0 (gen-counter 1)))
((= n 10) t)
(princ n))
0.1.2.3.4.5.6.7.8.9.T
>
Run Code Online (Sandbox Code Playgroud)
问题是这个带有macro
函数名后面的符号的语法在Common Lisp中无效.我试图在Common Lisp中获得类似的行为是不成功的.有人可以提供CL中类似宏的工作示例吗?
我一直在调查使用>>=
列表(当被视为monad时).在所有关于monads的文章中,我找到了列表的以下标识:l >>= f = concatMap f l
,其中l
是列表,f
是一些(一元)函数.我尝试了将列表中的每个元素加倍的简单示例,并得出以下结果:
let double :: Int -> [Int]
double = (flip (:) []) . (2*)
let monadicCombination :: [Int]
monadicCombination = [1,2,3,4,5] >>= double
Run Code Online (Sandbox Code Playgroud)
我特别希望double
函数以无点的方式编写.你能想到更简单的实现,double
以便它仍然可以使用>>=
吗?
我需要生成一个带有可变字符串长度的带空格的字符串。不太聪明的解决方案涉及以下内容的嵌套format
:
(format nil (format nil "~~~d,,a" 10) "asdf")
Run Code Online (Sandbox Code Playgroud)
现在,我想让它更聪明一点使用format
的~?
递归处理。我希望这样的事情可以满足我的要求:
(format nil "~@?" "~~~d,,a" 10 "asdf")
Run Code Online (Sandbox Code Playgroud)
但是我得到的只是格式字符串,即~10,,a
不是填充asdf
字符串。也许我在这里误解了“递归”一词,但是我希望CL形成了内部格式字符串之后,应该继续实际使用它。我想念什么吗?