小编And*_*eri的帖子

使用 let-values 而不是 let 有什么好处?

我脑海中的例子是:什么更好?

示例 1:

(define (foo x)
  ...
  (values a b c))

(let-values (((a b c) (foo  42)))
    ...)
Run Code Online (Sandbox Code Playgroud)

示例 2:

(define (foo x)
  ...
  (list a b c))

(let ((f (foo 42)))
  (let ((x (first f)) (y (second f)) (z (third f)))
      ...))
Run Code Online (Sandbox Code Playgroud)

我粗略的猜测是,第一种方法是最好的,因为在第二,因为每当有呼叫first/ second/third它在列表中有迭代。所以我的问题变成:如何values工作?它只是列表的语法糖还是使用其他东西?(例如一个数组)

如果这取决于实施,我会让您知道我正在使用鸡肉计划。

scheme let chicken-scheme

3
推荐指数
1
解决办法
966
查看次数

scheme lambda函数中的默认参数?

我最近开始使用ChickenScheme,现在我想声明一个带有默认参数的函数(如果没有指定).我在Racket网站上找到了这个例子,我知道Racket和ChickenScheme不同,但我认为这些基本的东西都是一样的.

(define greet
  (lambda (given [surname "Smith"])
    (string-append "Hello, " given " " surname)))
Run Code Online (Sandbox Code Playgroud)

这是ChickenScheme解释器的错误:

Error: during expansion of (lambda ...) - in `lambda' - lambda-list expected: (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname))

Call history:

<syntax>      (define greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)))
<syntax>      (##core#set! greet (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)))
<syntax>      (lambda (given (surname "Smith")) (string-append "Hello, " given " " surname)) …
Run Code Online (Sandbox Code Playgroud)

lambda scheme arguments function chicken-scheme

2
推荐指数
1
解决办法
966
查看次数

为什么valgrind无法检测到由于重新分配而导致的这种内存泄漏?

我不明白为什么valgrind(版本3.14)没有在此程序中检测到可能的内存泄漏:

#include <stdlib.h>

int main() {
  int *p = malloc(sizeof(int));
  p = realloc(p, 2 * sizeof(int));

  free(p);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

C99标准(ISO / IEC 9899:1999,第314页)表示以下内容realloc

如果无法分配用于新对象的内存,则不会释放旧对象,并且其值不变。[...] realloc函数返回指向新对象的指针(该值可能与指向旧对象的指针的值相同),如果无法分配新对象,则返回null指针。

因此,它可能发生的pNULL,但与以前分配的存储单元malloc仍然存在,不应该这是一个可能的内存泄漏?

如果我使用编译程序gcc -std=c99并执行valgrind,--tool=memcheck --leak-check=full --track-origins=yes则会显示以下消息:

#include <stdlib.h>

int main() {
  int *p = malloc(sizeof(int));
  p = realloc(p, 2 * sizeof(int));

  free(p);

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c valgrind memory-leaks realloc dynamic-memory-allocation

2
推荐指数
1
解决办法
69
查看次数

let in 方案的语法

我无法理解let在我发现的示例中的这种用法。我正在使用鸡肉计划。

(let loop ()
    (print "hello world")
    (loop)
)
Run Code Online (Sandbox Code Playgroud)

这是一个简单的无限循环,它递归地调用自己,我无法理解的是语法。我知道第一个参数必须是一个成对列表,((<var[1]> <value[1]>)...(<var[n]> <value[n]))其他参数是 let 的主体。那么,为什么这个片段有效呢?

scheme loops let named chicken-scheme

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

为什么我的悬空指针不会导致分段错误?

我的代码:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *p = (int *)malloc(sizeof(int));
    free(p);
    *p = 42;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我创建了一个指针,然后我将它指向分配的空间,最后我给它分配了42.在我看来它不应该工作,它应该导致分段错误,但它的工作原理.所以为什么?

PS:我通常在Linux上用Gcc编译它

c segmentation-fault dangling-pointer

0
推荐指数
1
解决办法
298
查看次数