【问题标题】:What does suffix "p" mean in common lisp functions?常见的 lisp 函数中的后缀“p”是什么意思?
【发布时间】:2021-12-31 19:06:32
【问题描述】:

例如:https://github.com/vindarel/cl-str#empty-emptyp-s

或者这个:https://stackoverflow.com/a/33379360/12400477

我在好几个地方都看到过这个,我不知道它是什么意思。 p 后缀是否表示函数返回的类型?它总是意味着它返回一个布尔值吗?为什么在第一个示例中,同一个函数似乎有两个替代符号?

【问题讨论】:

标签: common-lisp naming-conventions predicate


【解决方案1】:

对于 Common Lisp,有一堆 naming conventions。添加p-p 用于返回真值的函数。

这并不意味着该函数将只返回tniltrue 的其他值也是可能的:

谓词示例,该谓词将返回与t 不同的值以表示true

CL-USER 1 > (digit-char-p #\a)
NIL

CL-USER 2 > (digit-char-p #\1)
1                              ; any object other than nil
                               ; also means *true*

使用 ? 的惯例来自 Scheme 编程语言。

【讨论】:

    【解决方案2】:

    它代表谓词,即具有是或否答案的函数。示例:integerp(它是整数吗?)、realp、rationalp 等。

    【讨论】:

      【解决方案3】:

      扩展“p”代表“谓词”。谓词是返回真或假布尔结果的测试。谓词的概念适用于大多数(如果不是所有)语言。

      一个例子是参数 x 的“零谓词”,如果 x 为零,则返回 true,如果不为零,则返回 false。

      风格因语言而异,也取决于谓词名称。 Clojure 的风格是添加一个问号。 Common Lisp 的风格通常是在名称中添加一个“p”。当添加“-p”时,Common Lisp 对包含连字符的谓词名称有一个例外。第一个例子似乎想要同时做这两种风格,'?和 'p',取决于用户习惯的风格。

      谓词的编码涉及进行测试并返回结果而不是对其进行操作。

      Python:
      
      def zerop (x):
         return x == 0
      
      # zerop (0) => True
      # zerop (1) => False
      
      Common Lisp:
      
      (defun my-zero-p (x)
         (= x 0))
      
      ; (my-zero-p 0) => t
      ; (my-zero-p 1) => nil
      

      【讨论】:

      • NULL 也有一个例外。如果它遵循约定,它将是NULLP,但它来自早期的 Lisp 方言并且早于命名约定。
      【解决方案4】:

      因为还没有人说清楚,我想补充一下: 如果要附加p 的符号已经包含一个或多个-,则使用-p。如果没有,您只需附加p,不带连字符。

      所以one-word 会变成one-word-p,但blue 会变成bluep

      【讨论】:

        猜你喜欢
        • 2013-01-25
        • 2012-12-07
        • 2011-08-12
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        相关资源
        最近更新 更多