我脑海中的例子是:什么更好?
示例 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
工作?它只是列表的语法糖还是使用其他东西?(例如一个数组)
如果这取决于实施,我会让您知道我正在使用鸡肉计划。
我最近开始使用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) 我不明白为什么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指针。
因此,它可能发生的p
是NULL
,但与以前分配的存储单元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) 我无法理解let
在我发现的示例中的这种用法。我正在使用鸡肉计划。
(let loop ()
(print "hello world")
(loop)
)
Run Code Online (Sandbox Code Playgroud)
这是一个简单的无限循环,它递归地调用自己,我无法理解的是语法。我知道第一个参数必须是一个成对列表,((<var[1]> <value[1]>)...(<var[n]> <value[n]))
其他参数是 let 的主体。那么,为什么这个片段有效呢?
我的代码:
#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编译它