能否将字面量列表作为SRFI 1的append!过程的参数使用?
你的思路是完全正确的。SRFI 1的append!作为破坏性拼接过程,确实会对除最后一个入参外的所有列表入参调用set-cdr!修改其最后一个节点的尾指针,以此实现零额外内存分配的拼接。而字面量列表属于不可变对象,对其执行set-car!/set-cdr!属于Scheme标准规定的未定义行为,不只是“无效”这么简单,部分实现会直接抛出运行时错误,部分实现可能静默失败但修改不会生效,绝对不允许这么使用。
仅将字面量列表作为append!的最后一个入参是合法的,因为append!不会修改最后一个入参的内容,只会将前一个列表的尾指针指向它。
对应你给出的两个测试用例结论如下:
(append! (list 1) '(2 3)):合法。第一个入参是list过程生成的可变列表,会被append!修改尾指针,最后一个入参是字面量列表不会被修改,运行结果符合预期。(append! '(1) (list 2 3)):非法。第一个入参是字面量列表,append!会尝试修改它的尾指针,属于未定义行为,不应该在生产代码中出现。
内容的提问来源于stack exchange,提问作者Flux
相关产品推荐
相关产品推荐

