Racket 球拍对象的唯一标识符?

Racket 球拍对象的唯一标识符?,racket,Racket,有没有办法为球拍中的对象获取唯一标识符?例如,当我们使用Racket的eq?操作符检查两个变量是否引用同一个对象时,它使用什么标识符来实现此比较 我正在寻找类似python或Ruby的东西,换句话说,一些函数id,(=(id obj)(id obj2))意味着(eq?obj obj2)是真的 一些相关文件: 您很可能找不到标识,但对象本身只是自身的eq?,其他什么都没有等式?基本上比较值的地址位置。因此,如果你想要一个id,你可以将整个对象存储在那个地方,它将是唯一的 位置是一个绑定。将其视为

有没有办法为球拍中的对象获取唯一标识符?例如,当我们使用Racket的
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”结构类型有关。无论如何,我相信这与学习有关。如果我记得它是什么或者想到了另一个有价值的用例,我将计划在这里发表评论。