新年快乐!
我正在努力进入 Racket(我不是一个经验丰富的 Lisper)。
现在我在 Racket 8.3 中遇到了以下内容:
#lang racket
> (define str1 "hello")
> (define str2 "hello")
> (eq? str1 str2)
#t
Run Code Online (Sandbox Code Playgroud)
我期待#f像这里一样。在 Guile 和 Common Lisp 中,这被返回。
据此,我可以重现以下行为符合预期:
> (set! str1 (string #\h #\e #\l #\l #\o))
> (set! str2 (string #\h #\e #\l #\l #\o))
> (eq? str1 str2)
#f
Run Code Online (Sandbox Code Playgroud)
但我不明白原因。
是不是,在 Racket 中,只有函数 STRING 返回两个不同的对象,而文字字符串却像符号一样是唯一的?因此,等式?行为通常,但文字字符串的处理方式有所不同?
你能好心给我解释一下吗?
非常感谢。
只是为了完整起见,我想知道是否有一种方法可以在 Common Lisp 中定义“锯齿状”或“参差不齐的数组”,就像 Java 中描述的那样,例如:https: //www.geeksforgeeks.org/jagged -java中的数组/
伴随这个问题而来的是第二个问题,这样定义多维数组有什么好处呢?更有效的内存分配?或者“锯齿状数组”的想法本身就有问题——至少在 Common Lisp 上下文中是这样?
到目前为止,我只能找到定义矩形多维数组的常规方法的描述 - 或者我忽略了我正在搜索的信息。
此时此刻,我想象在 Common Lisp 中,如果这种不对称数据字段的复制似乎有用的话,人们会用 NIL 或 0 或类似常规多维数组中的内容填充不需要的位置。...或者我可能会通过尝试用它们定义一个自定义结构来管理三个不同长度的向量。
如果这些都是愚蠢的想法,还有其他方法吗?或者,Java 中的“参差不齐的数组”通常只是一个具有不同大小元素的嵌套向量,而 Common Lisp 中的多维数组也只是一个具有相同大小元素的嵌套向量,它附带了一些用于管理常规结构的有用抽象?
我非常感谢您的回复。