Racket 球拍对象的唯一标识符?
有没有办法为球拍中的对象获取唯一标识符?例如,当我们使用Racket的Racket 球拍对象的唯一标识符?,racket,Racket,有没有办法为球拍中的对象获取唯一标识符?例如,当我们使用Racket的eq?操作符检查两个变量是否引用同一个对象时,它使用什么标识符来实现此比较 我正在寻找类似python或Ruby的东西,换句话说,一些函数id,(=(id obj)(id obj2))意味着(eq?obj obj2)是真的 一些相关文件: 您很可能找不到标识,但对象本身只是自身的eq?,其他什么都没有等式?基本上比较值的地址位置。因此,如果你想要一个id,你可以将整个对象存储在那个地方,它将是唯一的 位置是一个绑定。将其视为
eq?
操作符检查两个变量是否引用同一个对象时,它使用什么标识符来实现此比较
我正在寻找类似python或Ruby的东西,换句话说,一些函数id
,(=(id obj)(id obj2))
意味着(eq?obj obj2)
是真的
一些相关文件:
您很可能找不到标识,但对象本身只是自身的
eq?
,其他什么都没有<代码>等式?基本上比较值的地址位置。因此,如果你想要一个id,你可以将整个对象存储在那个地方,它将是唯一的
位置是一个绑定。将其视为无法获取的地址,以及具有对象地址的地址。例如,绑定((lambda(a)a)10)
将对象10
的地址位置存储在第一个堆栈地址中,而正文中的代码只返回相同的地址。位置可以通过set进行更改代码>但您永远无法获取它的内存位置
lisp系统通常将值存储在指针中。这意味着某些类型和值在地址处实际上没有对象,但地址中有一个系统知道的编码的值和类型。通常,小整数、字符、符号和布尔可以是指针相等的,即使它们是在不同的时间构造的。例如,”(1 2 3)
只会使用3对,值1-3和()
没有任何空间。有一种方法可以通过ffi/unsafe
获取对象的C指针,但明显的警告是这是不安全的
;; from https://rosettacode.org/wiki/Address_of_a_variable#Racket
(require ffi/unsafe)
(define (madness v) ; i'm so sorry
(cast v _racket _gcpointer))
要使用它:
(define a (list 1 2))
(define b (list 1 2))
(printf "a and b have different address: ~a ~a\n"
(equal? (madness a) (madness b))
(eq? a b))
(printf "a and a have the same address: ~a ~a\n"
(equal? (madness a) (madness a))
(eq? a a))
(printf "1 and 1 have the same address: ~a ~a\n"
(equal? (madness 1) (madness 1))
(eq? 1 1))
尽管指针不是数字或标识符。这是一个不透明的物体。。。所以从某种意义上说,这是没用的。您可以将真实对象与eq?
一起使用
我也不知道这种方法有什么保证。特别是,我不知道当copy GC复制对象时指针是否会更新到其最新值。下面是使用弱哈希表实现的此类函数。
使用弱哈希表可以确保正确地对对象进行垃圾收集
即使我们给了它一个身份证
#lang racket
(define ht (make-weak-hasheq))
(define next 0)
(define (get-id x)
(define id (hash-ref ht x #f))
(or id
(begin0
next
(hash-set! ht x next)
(set! next (+ next 1)))))
(get-id 'a)
(get-id 'b)
(get-id 'a)
请注意,西尔维斯特的建议是正确的。标准是直接存储值。是您想要的吗
> (define l1 '(1))
> (define l2 '(1))
> (eq? l1 l2)
#f
> (eq-hash-code l1)
9408
> (eq-hash-code l2)
9412
你需要这样一个数字干什么?不幸的是,我现在记不清了,但它与理解Racket解释器在某些上下文中的工作方式有关,或者可能与“prefate”结构类型有关。无论如何,我相信这与学习有关。如果我记得它是什么或者想到了另一个有价值的用例,我将计划在这里发表评论。