小编Wer*_*dok的帖子

读取SBCL中带有类型插槽的结构

考虑这个简单的代码示例:

(defstruct test
  (:example nil :type (simple-array single-float)))

(defparameter test-struct
  (make-test :example (make-array 10 :element-type 'single-float
                                     :initial-element 1.0)))
Run Code Online (Sandbox Code Playgroud)

我们可以看到,没有什么可以疯狂的,定义了一个带有单个槽的简单结构.我们还指定:example插槽是强类型,预期是单个浮点数组.这里没有问题,一切正常.

我们test-struct现在写一个文件:

(with-open-file (out "~/Desktop/out.test"
             :direction :output
             :if-exists :supersede)
  (format out "~s" test-struct))
Run Code Online (Sandbox Code Playgroud)

同样,没有惊喜,我们在桌面上获得一个漂亮的小文件,其中包含以下内容:

#S(TEST :EXAMPLE #(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0))
Run Code Online (Sandbox Code Playgroud)

然而,紧张开始蔓延,因为我们注意到没有任何迹象表明这个特定的文字数组应该包含单个浮点数.有了这种怀疑,让我们尝试加载这个结构:

(defparameter loaded-struct
  (with-open-file (in "~/Desktop/out.test")
    (read in nil)))
Run Code Online (Sandbox Code Playgroud)

我们在这里,SBCL愉快地将我们放入调试器:

尝试读取类型化数组时,SBCL会进入调试器

问题是:有没有办法指示SBCL验证结构中的这个数组插槽是否是有效类型并加载它?或者换句话说,是否可以在不诉诸构建自定义编写器和构造函数的情况下读取具有强类型插槽的结构?

lisp arrays sbcl common-lisp read-eval-print-loop

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

SBCL阵列可以将类型化数组作为元素吗?

考虑这个简单的例子:

(deftype image nil '(simple-array single-float (100)))
Run Code Online (Sandbox Code Playgroud)

这里我们定义一个类型的简写,这个类型是一个包含单个浮点数的数组.让我们尝试创建一个这样的:

(defparameter tmp
  (make-array 100
              :element-type 'single-float
              :initial-element 0.0))
Run Code Online (Sandbox Code Playgroud)

让我们检查一下以防万一:

CL-USER> (type-of tmp)
(SIMPLE-ARRAY SINGLE-FLOAT (100))
Run Code Online (Sandbox Code Playgroud)

都好.让我们看看我们是否可以将这些小数组放在另一个数组中,以使检索更容易,而不是将所有内容放入一个单维数组中,最终让人头痛地计算访问索引.

(defparameter image-array
  (make-array 10
              :element-type 'image
              :initial-element tmp))
Run Code Online (Sandbox Code Playgroud)

它不会失败,但检查以防万一:

CL-USER> (type-of image-array)
(SIMPLE-VECTOR 10)
Run Code Online (Sandbox Code Playgroud)

哎呀,这根本不是我们想要的.似乎这个新数组默认为默认元素类型:

CL-USER> (array-element-type image-array)
T
Run Code Online (Sandbox Code Playgroud)

这可能意味着应用程序现在必须不仅要检查容器数组元素,还要检查子数组的元素以及性能的所有后果.出现的问题是:

是否可以在SBCL中将类型化数组作为数组元素存储在另一个数组中?

编辑:恐慌可能有点太早,因为这会返回正确的类型:

CL-USER> (type-of (aref image-array 0))
(SIMPLE-ARRAY SINGLE-FLOAT (100))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,为什么我们从中获取T元素类型(array-element-type image-array)

lisp arrays sbcl common-lisp multidimensional-array

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

如何检查符号是否为T?

我正在做一些文本处理,其中一部分是将单词分成单个字符.每个角色都以大写字母作为符号实例化,只是为了方便起见而赋予它一些频率值,但正如人们可能想象的那样,T常量形式存在一个绊脚石.

我现在看的解决方案是简单地使用小写符号而不是大写字母T,但是我想知道是否有一种快速简便的方法来验证手头的符号是否为T.

我能想到的只有:

(实习生(如果(字符串="T"(符号名称符号))#\ t\t符号)

但这并不好看,因为字符串比较并不繁琐.有任何想法吗?

PS.我需要大写的所有符号,因为在听众中评估它们不那么麻烦,但我可以使用一个小写t.

lisp common-lisp

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