忽略本机互操作和瞬态,是否可以在Clojure中创建包含直接循环引用的任何数据结构?
似乎不可变数据结构只能包含对其自身先前版本的引用.是否有任何Clojure API可以创建一个引用自身的新数据结构?
Scheme具有letrec形式,允许创建相互递归的结构 - 但据我所知,Clojure没有任何类似的东西.
这个问题与将Clojure移植到iOS有关 - 它没有垃圾收集,但确实有引用计数.
如果要在Javascript引擎之上实现Ruby(在浏览器中或在独立的V8或Spidermonkey之上),那么Ruby和JS对象模型之间的关键阻抗不匹配是什么?
我正在使用Racket Objective-C FFI在应用程序中嵌入WebKit WebView.
为了接收页面加载通知,我在Racket中创建了一个新的ObjC类,它被设置为web-view的帧加载委托.
该类看起来像:
(define-objc-class MyWebFrameLoadDelegate NSObject
[]
(- _void (webView: [_id wv] didFinishLoadForFrame: [_id wf])
(send frame set-status-text "Page Loaded")))
Run Code Online (Sandbox Code Playgroud)
在DrRacket中运行代码时,它第一次运行良好.进一步的迭代会导致进程死亡:
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000020
...
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff8511e299 objc_registerClassPair + 63
1 Racket 0x00000001002d329c ffi_call_unix64 + 76
2 Racket 0x00000001002d3eb4 ffi_call + 644
3 Racket 0x00000001002c612f ffi_do_call + 1599
4 ??? 0x00000001004b50cc 0 + 4299903180
...
Run Code Online (Sandbox Code Playgroud)
...这似乎表明它是ObjC类的重新定义的原因.
是否有一种干净的方式使用FFI或更一般的Racket功能,以避免重新定义类(如果它已经存在)?
我尝试define-objc-class用条件包装,但它需要是一个顶级形式.
我可以下载到原始的ObjC运行时函数并动态定义委托类 - 但是避免这样做会很好.
解决方案 …