racket吧 关注:47贴子:121
  • 5回复贴,共1

居然有贴吧了,顺便问个问题

只看楼主收藏回复

Racket里的interned的uninterned是什么意思我没太看明白,请问大家这两个到底是什么意思。看文档没太看明白,英文渣啊


IP属地:湖南1楼2014-02-15 10:28回复
    不清楚, ,,
    lz看完sicp了吗?。。。,


    来自手机贴吧2楼2014-02-16 07:08
    收起回复
      欢迎来drracket吧交流学习~~~~
      A symbol is like an immutable string, but symbols are normallyinterned, so that two symbols with the same character content are normally eq?. All symbols produced by the default reader (see Reading Symbols) are interned.
      The two procedures string->uninterned-symbol and gensym generateuninterned symbols, i.e., symbols that are not eq?, eqv?, or equal? to any other symbol, although they may print the same as other symbols.
      ——————————————————————————
      个人理解:
      一般定义的符号都是interned的,只要名称一样,他们引用的数据源是一样的,所以用eq? 比较会得出#t
      而用gensym等命令生成的符号都是uninterned,即使生成的两个名称相同,引用的源数据也不同,所以用eq?等命令得到#f 。
      ———————————————————————————
      附:
      eq?比较的原理类似于指针,只要指向同一个对象比较结果就为#t.
      gensym一半用在宏定义,因为以前的宏是非卫生的宏,如果宏参数和宏中变量名字相同,则会引用相同的数据,而这不是宏的本意,会造成宏运行失败和产生错误的结果。
      和用gensym 会生成内部名称(一般形式为 变量名+一串数字),确保和外部参数不会同名,从而确保了宏的卫生~~~ 且此生成的名称需要在第一次生成后定义关联,用关联访问。
      不用关联的话,即使直接用生成的符号名,访问的也不是同一个对象。这大概就是uninterned的定义了吧。
      最后,欢迎各位来drracket吧交流学习~~~~


      IP属地:上海3楼2014-03-10 14:02
      收起回复