我认为GCC扩展__attribute__((cleanup))是一个好主意,至少在某些情况下,但我无法弄清楚如何以一种好的方式使用它.我所做的一切看起来仍然很烦人.
我看到了很多的代码做#define _cleanup_(x) __attribute__((cleanup(x))只是为了少打字,但它有没有办法通过有没有一个标准功能一样free或者closedir,fclose等?
我看到我不能写:
__attribute__((cleanup(free))) char *foo = malloc(10);
Run Code Online (Sandbox Code Playgroud)
因为清理回调会收到char**指针,所以我必须总是这样写:
static void free_char(char **ptr) { free(*ptr); }
__cleanup__((free_char)) char *foo = malloc(10);
Run Code Online (Sandbox Code Playgroud)
这非常烦人,最烦人的部分是为你需要的所有类型定义这样的清理函数,因为显然你不能只为它定义它void **.避免这些事情的最佳方法是什么?
我正在读一本关于C的书,在作者代码的某处我发现了一个函数原型的定义,然后是一个具有相同名称的宏,并且在任何.h或.c文件中都没有函数本身的定义.
我的意思是这样的:
int print_my_stufff(char *stuff);
#define print_my_stuff(A) (printf("%s\n", A))
/* and print-my-stuff() function never defined anywhere else */
Run Code Online (Sandbox Code Playgroud)
代码有效,但我不知道为什么他首先需要一个函数原型?难道他不能写一个宏吗?重点是什么?是告诉编译器应该将宏评估为返回的表达式int还是什么?删除原型似乎不会改变行为.作者没有解释这一点.
我无法想象,有没有办法在erlang中输入_之类的东西,在destructuring-bind中使用"未使用的值"?
例如,我们有类似的东西:
(destructuring-bind ((_SNIPPET
(_TITLE . title)
(_DESCRIPTION . description)
_RESOURCE-ID (_VIDEO-ID . video-id)))) entry
(declare (ignore
_SNIPPET _TITLE _DESCRIPTION _RESOURCE-ID _VIDEO-ID))
(list video-id title description)))
Run Code Online (Sandbox Code Playgroud)
如果不为每个未使用的值放置特定变量,那就太棒了,写下这样的东西:
(destructuring-bind ((_
(_ . title)
(_ . description)
(_ (_ . video-id)))) entry
(list video-id title description)))
Run Code Online (Sandbox Code Playgroud)
有没有办法通过标准解构 - 绑定或任何其他标准宏来获得这种行为?或者我必须使用一些类似ML的模式匹配库,如果是这样 - 哪一个?
有没有办法让对象定义所有方法并检查对象是否响应指定的方法?
寻找类似Ruby的"foo".方法
(list-methods *myobj*) ;; -> (method0 method1 methodN)
Run Code Online (Sandbox Code Playgroud)
还有像ruby的"foo".respond_to?:方法
(has-method-p *myobj* 'foo-method) ;; -> T
Run Code Online (Sandbox Code Playgroud)
对于插槽,有slot-exists-p什么方法?
谢谢.
可能这个问题真的很糟糕,但我被困住了.如何cl-ppcre:regex-replace-all更换反斜杠?
例如,我只想逃避一些字符,比如'"()等,所以我首先要用|替换,看看匹配是否正常:
CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "|\\1"))
PRINTED: foo |"bar|" |'baz|' |(test|)
Run Code Online (Sandbox Code Playgroud)
好的,我们把斜线:
CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\1"))
PRINTED: foo "bar" 'baz' (test) ;; No luck
Run Code Online (Sandbox Code Playgroud)
不,我们有两个斜线:
CL-USER> (princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\\1"))
PRINTED: foo \1bar\1 \1baz\1 \1test\1 ;; Got slash, but not \1
Run Code Online (Sandbox Code Playgroud)
也许是这样的?
(princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])"
"foo \"bar\" 'baz' (test)" "\\\{1}"))
PRINTED: foo "bar" 'baz' (test) ;; Nope, no luck here
Run Code Online (Sandbox Code Playgroud)
当然,如果我在斜线之间放置空间就可以了,但我不需要它
(princ (cl-ppcre:regex-replace-all "(['\\(\\)\"])" …Run Code Online (Sandbox Code Playgroud) 我正在尝试自动添加; 或者通过击键在表达结束时需要的任何内容,并转到另一行.
基本上它会是这样的inoremap <leader>; <C-o>A;,但我想要一点改进.如果下一行是空的(或不存在)我希望它做<C-o>A;<cr>,如果它不是空的<C-o>A;<Down>.换句话说,我需要一种惯用的方法来检查下一行是否存在以及它是否为空.谢谢.
为什么funcall没有语法糖?我们需要它很多.写一些像是为什么不添加类似Ruby的&:方法表示法的东西(&#do-something arg0 arg1 arg2)不是很好(funcall do-something arg0 arg1 arg2)吗?语言中是否有某些内容?