【问题标题】:List all user-defined variables in scheme列出方案中所有用户定义的变量
【发布时间】:2012-06-09 12:32:06
【问题描述】:

在 python 中我可以使用 dir() 在球拍 (5.2) 中我可以这样做

 (require xrepl)
 ,apropos

获取所有已定义变量的列表。在所有方案中都有什么可移植的方法来做同样的事情?完成后,如何过滤掉所有系统和模块变量?变量的完整列表在球拍中相当令人生畏。

【问题讨论】:

  • “系统和模块变量”是什么意思?你想看哪些
  • 在所有方案中都没有办法做到这一点。
  • 我只想查看用户变量,而不是其他模块或系统定义的内容。
  • “用户”变量和“系统”变量之间没有区别。如果您的代码以#lang 开头,那么您正在编写一个模块。系统库也被定义为模块。没有区别。但我很困惑。你说你想要和 Python dir() 一样。来自手册:“内置函数 dir() 用于找出模块定义的名称。”所以你的问题是关于模块中的变量?
  • 我猜“用户”不是很清楚。我经常让我的 REPL 长时间处于打开状态。我可能已经完成了一半,我不记得我使用过的变量的名称。我想看看他们的名单。不带参数的 Python dir() 会给我一个本地命名空间中所有变量的列表,包括导入和系统变量(我也可以使用 locals())。 ,apropos 似乎也是如此,但列表很大,xrepl 并不总是可用。应该有某种方法可以获取本地命名空间中的名称列表,然后可能会减去您在下面的答案中给出的列表。

标签: scheme racket


【解决方案1】:

要获取 Racket 中特定模块导出的名称,请使用 module->exports。对于其他实现,您需要在文档中查找。

> (module->exports 'racket/list)
'((0
   (add-between ()) (append* ())    (append-map ())
   (argmax ())      (argmin ())     (cons? ()) (count ())
   (drop ())        (drop-right ()) (eighth ()) (empty ())
   (empty? ())      (fifth ())      (filter-map ())
   (filter-not ())  (first ())      (flatten ())
   (fourth ())      (last ())       (last-pair ())
   (make-list ())   (ninth ())      (partition ())
   (range ())       (rest ())       (second ())
   (seventh ())     (shuffle ())    (sixth ())
   (split-at ())    (split-at-right ()) (take ())
   (take-right ())  (tenth ()) (third ())))
'((0 (remove-duplicates ())))

【讨论】:

  • 这很有趣也很有用,但这与我想要的相反。我想过滤掉所有这些,看看还剩下什么。
  • 在 Racket REPL 中,您可能可以使用 namespace-mapped-symbols 来获取当前可访问的所有绑定的列表,然后从语言中减去绑定。类似于 (set->list (set-subtract (list->set (namespace-mapped-symbols)) (list->set (namespace-mapped-symbols (module->namespace 'racket))))) .
  • @dyoo 你的代码尽可能接近我可以合理地得到的(即在不同的环境中工作,如 xrepl 和 geiser)。如果您将其发布为答案,我会接受。
【解决方案2】:

好吧,下面是guile (v. >= 2.0) 中的操作方法:

scheme@(guile-user)> ,binding
%module-public-interface #<variable 9e55e98 value: #<interface (guile-user) 9df6678>>

scheme@(guile-user)> (define foo 'bar)

scheme@(guile-user)> ,binding
foo                     #<variable a06fe28 value: bar>
%module-public-interface #<variable 9e55e98 value: #<interface (guile-user) 9df6678>>

您可以更改上下文以获取某些模块导出的绑定:

scheme@(guile-user)> (use-modules (srfi srfi-1))
scheme@(guile-user)> ,module (srfi srfi-1)
scheme@(srfi srfi-1)> ,binding
reduce-right            #<variable 9ead2d0 value: #<procedure reduce-right (f ridentity lst)>>
delete                  #<variable 9eb7aa8 value: #<procedure delete (_ _ #:optional _)>>
lset-xor!               #<variable 9eb7c90 value: #<procedure lset-xor! (= . rest)>>
take!                   #<variable 9ead640 value: #<procedure take! (lst i)>>
...

【讨论】:

  • 不错!唉,xrepl 没有 ,binding
猜你喜欢
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2011-05-31
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-03
相关资源
最近更新 更多