我经常遇到包含extern "C"
警卫的C头文件,
但不包含任何实际功能.例如:
/* b_ptrdiff.h - base type ptrdiff_t definition header */
#ifndef __INCb_ptrdiff_th
#define __INCb_ptrdiff_th
#ifdef __cplusplus
extern "C" {
#endif
#ifndef _PTRDIFF_T
#define _PTRDIFF_T
typedef long ptrdiff_t;
#endif /* _PTRDIFF_T */
#ifdef __cplusplus
}
#endif
#endif /* __INCb_ptrdiff_th */
Run Code Online (Sandbox Code Playgroud)
我知道这extern "C"
可以防止对函数进行名称修改,但它是否也可以防止变量和类型声明的其他接口问题?
extern "C"
在产生兼容性方面,上述示例中的使用是否毫无意义?
在我的Scheme程序中,我有一个非常简单的要求,即在'if' 的真实条件下执行多个语句..所以我写了我的代码,如下所示:
(if (= 1 1)
((expression1) (expression2)) ; these 2 expressions are to be
; executed when the condition is true
(expression3))
Run Code Online (Sandbox Code Playgroud)
显然,上面的方法不起作用,因为我无意间用#参数创建了一个#过程.因此,为了完成我的工作,我只需将上面的表达式放在一个新函数中,然后从那里调用它,代替expression1,expression2.有用.
所以,我的观点是:是否有其他条件结构可以支持我的要求?
(defun triangle-using-cond (number)
(cond
((<= number 0) 0) ; 1st
((= number 1) 1) ; 2nd
((> number 1) ; 3rd
;; 4th
(+ number
(triangle-using-cond (1- number))))))
Run Code Online (Sandbox Code Playgroud)
关于康德的事情
我无法区分的一件事是cond与函数有什么不同!
例如以下功能:
fun fac (0 : int) : int = 1
| fac (n : int) : int = n * fac (n - 1)
Run Code Online (Sandbox Code Playgroud)
或者在功能中:
fun even 0 = true
| even x = odd(x-1)
and odd 0 = false
| odd x = even(x-1);
Run Code Online (Sandbox Code Playgroud)
我对ML的经验很少,我只是想了解基础知识.
我正在阅读黑客和画家,并对作者提到的问题感到困惑,以说明不同编程语言的力量.
问题是:
我们想编写一个生成累加器的函数 - 一个取n的函数,并返回一个函数,该函数接受另一个数字i并返回n递增i.(这是增加的,而不是加号.累加器必须累积.)
作者提到了几种使用不同编程语言的解决方案.例如,Common Lisp:
(defun foo (n)
(lambda (i) (incf n i)))
Run Code Online (Sandbox Code Playgroud)
和JavaScript:
function foo(n) { return function (i) { return n += i } }
Run Code Online (Sandbox Code Playgroud)
但是,当涉及到Python时,以下代码不起作用:
def foo(n):
s = n
def bar(i):
s += i
return s
return bar
f = foo(0)
f(1) # UnboundLocalError: local variable 's' referenced before assignment
Run Code Online (Sandbox Code Playgroud)
一个简单的修改将使其工作:
def foo(n):
s = [n]
def bar(i):
s[0] += i
return …
Run Code Online (Sandbox Code Playgroud) 在 CppCon 的一次演讲中(https://www.youtube.com/watch?v=80BZxujhY38 5:00)Herb Sutter暗指在defun defun 3
某种程度上是一个问题。在我用谷歌搜索之后,我仍然不清楚为什么。有人可以详细说明吗?
我想在SBCL中实现一个简单的双链表,其关键结构如下
(defstruct element
(value 0 :type fixnum)
(next nil :type element)
(prev nil :type element))
Run Code Online (Sandbox Code Playgroud)
问题是,不可能实例化第一个元素,因为 next 和 prev 都可能为零。它们的类型是元素,所以它们必须是一个实例。
如果我删除 type 属性,这个问题基本上很容易解决。但事实是,这部分程序需要非常快,所以我想给优化器一个充分利用它的机会。
有没有其他方法可以指定成员的类型并使它们为零?或者更好:有没有办法创建一个带有 next 和 prev 引用实例本身的启动实例?
我有一个返回大量行的 sql 查询。我想将查询结果保存到磁盘上的 csv 文件中。但是,因为有太多行,所以在 sql 查询可以聚合所有行之前,我的内存不足。
它看起来像这样,并且在查询部分失败:
(-> query format-transformer csv-writer)
Run Code Online (Sandbox Code Playgroud) 比方说,有一种通用的方法incx
.有两个版本incx
.一个专门的类型a
,一个专门的类型b
.Type b
是的子类a
.您将获得一个类型的对象b
,派生类型 - 但您想要调用专用于类型的方法a
.如果还没有一个专门针对类型的同名方法,你可以很容易地做到这一点b
,但是,有这样的方法.
那么a
在这种情况下如何调用专用于类型的方法呢?
(defclass a () ((x :accessor x :initform 0)))
(defclass b (a) ((y :accessor y :initform 0)))
(defgeneric inc (i))
(defmethod inc ((i a)) (incf (x i)))
(defmethod inc ((i b)) (incf (y i)))
(defvar r (make-instance 'b))
Run Code Online (Sandbox Code Playgroud)
正如CLOS所承诺的,这称为最专业的方法:
* (inc r)
* (describe r)
..
Slots with :INSTANCE allocation:
X = 0
Y = 1
Run Code Online (Sandbox Code Playgroud)
但在这种特殊情况下,(不是一般)我想要的是访问不太专业的版本.说出类似的话: …
我想定义一个LISP宏dolist
,让我定义一个可选的输出参数。在下面的案例研究中,此宏将称为doread
。它将从文件中读取行并返回以这种方式找到的行数。
(let ((lines 0))
(doread (line file lines)
;; do something with line
(incf lines)))
Run Code Online (Sandbox Code Playgroud)
问题是要使它lines
在上面的宏中起作用
我可以使用&key来完成我想做的事情,但不能使用&optional&key来做(因为我想控制文件的读取方式,所以需要&key;例如,使用read
or read-line
或其他方法)。
现在下面的作品但到作品走错了路。这里的out
参数必须是a &key
而不是&optional:
;; this way works...
(defmacro doread ((it f &key out (take #'read)) &body body)
"Iterator for running over files or strings."
(let ((str (gensym)))
`(with-open-file (,str f)
(loop for ,it = (funcall ,take ,str nil)
while ,it do
(progn ,@body))
,out)))
;; lets me define something …
Run Code Online (Sandbox Code Playgroud)