首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有一种方法可以了解原语函数(内建)是如何在SBCL中精确定义的?

是否有一种方法可以了解原语函数(内建)是如何在SBCL中精确定义的?
EN

Stack Overflow用户
提问于 2021-05-19 17:24:32
回答 1查看 179关注 0票数 1

我正在学习使用Emacs,SBCL和Slime的通用Lisp。

我想确切地知道内置函数的代码定义是什么。

我知道如何使用(documentation ...)(describe ...)。然而,它们只提供高级别的信息。我想看看代码的细节。

例如,以nth内置函数为例。

Documentation给了我们:

代码语言:javascript
复制
CL-USER> (documentation 'nth 'function)
"Return the nth object in a list where the car is the zero-th element."

Describe给了我:

代码语言:javascript
复制
CL-USER> (describe 'nth)
COMMON-LISP:NTH
  [symbol]

NTH names a compiled function:
  Lambda-list: (SB-IMPL::N LIST)
  Declared type: (FUNCTION (UNSIGNED-BYTE LIST) (VALUES T &OPTIONAL))
  Derived type: (FUNCTION (T T) (VALUES T &OPTIONAL))
  Documentation:
    Return the nth object in a list where the car is the zero-th element.
  Inline proclamation: MAYBE-INLINE (inline expansion available)
  Known attributes: foldable, flushable, unsafely-flushable
  Source file: SYS:SRC;CODE;LIST.LISP

(SETF NTH) names a compiled function:
  Lambda-list: (SB-KERNEL::NEWVAL SB-IMPL::N LIST)
  Derived type: (FUNCTION (T UNSIGNED-BYTE LIST) (VALUES T &OPTIONAL))
  Inline proclamation: INLINE (inline expansion available)
  Source file: SYS:SRC;CODE;SETF-FUNS.LISP

(SETF NTH) has a complex setf-expansion:
  Lambda-list: (SB-IMPL::N LIST)
  (undocumented)
  Source file: SYS:SRC;CODE;DEFSETFS.LISP
; No value

我希望看到这样的情况:

代码语言:javascript
复制
(unknown-command 'nth)

它会返回如下内容:

代码语言:javascript
复制
(defun nth (x xs)
  (if (equal x 0)
      (car xs)
      (my-nth (- x 1) (cdr xs))))

Lisp语言非常棒,并且有一个由出色的程序员构建的巨大的生态系统。我希望这方面有一些工具或命令。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-19 18:05:34

当这些信息可用时,应该可以通过访问。

代码语言:javascript
复制
* (FUNCTION-LAMBDA-EXPRESSION #'nth)
(LAMBDA (SB-IMPL::N LIST)
  (DECLARE (SB-INT:EXPLICIT-CHECK)
           (OPTIMIZE SPEED))
  (BLOCK NTH
    (TYPECASE SB-IMPL::N
      ((AND FIXNUM UNSIGNED-BYTE)
       (BLOCK NIL
         (LET ((SB-IMPL::I SB-IMPL::N) (SB-IMPL::RESULT LIST))
           (TAGBODY
            LOOP
             (THE LIST SB-IMPL::RESULT)
             (IF (PLUSP SB-IMPL::I)
                 (PSETQ SB-IMPL::I (1- SB-IMPL::I)
                        SB-IMPL::RESULT (CDR SB-IMPL::RESULT))
                 (RETURN (CAR SB-IMPL::RESULT)))
             (GO LOOP)))))
      (T (CAR (NTHCDR SB-IMPL::N LIST))))))
NIL
NTH

但是,它并不总是可用的,在这种情况下,您必须转到SBCL源代码存储库

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67608057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档