我有一个通用类 A 及其子类 B:
class A<T1: Any,T2: Any> {
let x: T1
let y: T2
init (_ v1: T1, _ v2: T2) {
self.x=v1
self.y=v2
}
}
class B<T: Any>: A<T,T> {
init (_ v: T) {
super.init(v,v)
}
}
Run Code Online (Sandbox Code Playgroud)
我需要一个不同对象的集合,它们都属于 A 的子类:
var arr=[A<Any,Any>]()
Run Code Online (Sandbox Code Playgroud)
但是我无法将对象放入集合中,以下代码导致错误:
let t=B(10)
arr.append(t as A<Any,Any>)
Run Code Online (Sandbox Code Playgroud)
错误是:
无法在强制转换中将“B”类型的值转换为“A”类型(又名“A,协议<>>”)
如何解决这个问题?
我想捕获unbound-variable异常并避免它们,即时创建一些变量而不会中断执行。我正在尝试在以下代码中使用handler-bindwith invoke-restart:
(defmacro my-progn (&rest rest)
`(handler-bind
((unbound-variable
(lambda (x)
(progn
;(format t "UNBOUND VAR: ~a~%"
; (symbol-name (cell-error-name x)))
(invoke-restart 'just-continue)))))
(progn ,@(mapcar (lambda (x)
`(restart-case ,x (just-continue () "XXXX"))) rest))))
(my-progn
(print "AAA")
(print xxxx) ;; xxxx is unbound
(print "BBB"))
Run Code Online (Sandbox Code Playgroud)
结果是:
"AAA"
"BBB"
Run Code Online (Sandbox Code Playgroud)
但我想继续执行 second print,只需将未绑定的变量 xxxx 替换为字符串“XXXX”:
"AAA"
"XXXX"
"BBB"
Run Code Online (Sandbox Code Playgroud)
当然,我可以用 包裹语法树中的任何符号handler-bind,但我担心这会产生巨大的开销。
有没有办法只捕获unbound-variable异常并使用动态生成的值而不是丢失的变量继续执行代码?
我正在尝试启用速度优化是 SBCL 2.3.1。编译如下代码:
(defun test (x y)
(declare (optimize speed))
(declare (type single-float x y))
(+ x (sqrt y)))
Run Code Online (Sandbox Code Playgroud)
产生以下注释:
; processing (DEFUN TEST ...)
; file: /var/tmp/slimeftWp5F
; in: DEFUN TEST
; (SQRT RT-SPEC::Y)
;
; note: unable to
; optimize
; due to type uncertainty:
; The result is a (VALUES (OR (COMPLEX SINGLE-FLOAT) (SINGLE-FLOAT -0.0))
; &OPTIONAL), not a (VALUES FLOAT &REST T).
; (+ RT-SPEC::X (SQRT RT-SPEC::Y))
;
; note: forced to do GENERIC-+ (cost 10) …Run Code Online (Sandbox Code Playgroud)