小编cor*_*ump的帖子

有没有理由在没有方法的标题上使用extern"C"?

我经常遇到包含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"在产生兼容性方面,上述示例中的使用是否毫无意义?

c c++ header-files extern extern-c

18
推荐指数
2
解决办法
905
查看次数

关于Scheme中的"If .."(plt-scheme)

在我的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.有用.

所以,我的观点是:是否有其他条件结构可以支持我的要求?

lisp scheme racket

16
推荐指数
1
解决办法
1万
查看次数

为什么cond是Scheme中的特殊形式,而不是函数?

(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与函数有什么不同!

scheme programming-languages functional-programming racket

9
推荐指数
2
解决办法
1200
查看次数

管道(|)在ML编程中意味着什么?

例如以下功能:

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的经验很少,我只是想了解基础知识.

ml sml pattern-matching

6
推荐指数
1
解决办法
493
查看次数

在Python中返回累加器的函数

我正在阅读黑客和画家,并对作者提到的问题感到困惑,以说明不同编程语言的力量.

问题是:

我们想编写一个生成累加器的函数 - 一个取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)

python closures scope common-lisp local-variables

5
推荐指数
1
解决办法
985
查看次数

(defun defun() 3) 会做什么?

在 CppCon 的一次演讲中(https://www.youtube.com/watch?v=80BZxujhY38 5:00)Herb Sutter暗指在defun defun 3某种程度上是一个问题。在我用谷歌搜索之后,我仍然不清楚为什么。有人可以详细说明吗?

lisp

5
推荐指数
1
解决办法
1648
查看次数

Common Lisp 中的双链表

我想在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 引用实例本身的启动实例?

lisp initialization sbcl common-lisp data-structures

5
推荐指数
3
解决办法
188
查看次数

在clojure中将大文件写入磁盘

我有一个返回大量行的 sql 查询。我想将查询结果保存到磁盘上的 csv 文件中。但是,因为有太多行,所以在 sql 查询可以聚合所有行之前,我的内存不足。

它看起来像这样,并且在查询部分失败:

(-> query format-transformer csv-writer)
Run Code Online (Sandbox Code Playgroud)

csv clojure

4
推荐指数
1
解决办法
552
查看次数

CLOS:如何调用一个不太具体的方法?

比方说,有一种通用的方法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)

但在这种特殊情况下,(不是一般)我想要的是访问不太专业的版本.说出类似的话: …

methods inheritance common-lisp reusability clos

4
推荐指数
2
解决办法
1379
查看次数

有没有办法混合LISP的宏&optional和&key参数?

我想定义一个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;例如,使用reador 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)

lisp macros common-lisp

4
推荐指数
1
解决办法
112
查看次数