Scheme中的真值

Scheme中的真值,scheme,lisp,Scheme,Lisp,方案标准中是否定义了真值的含义?或者方案评估者的实施者是否可以选择将其定义为: (define(true?x)(eq?x#t))?您可以定义这样一个函数,但最好使用 (define (true? x) (not (eq? x #f))) 这与所有内置条件操作的逻辑相匹配。如第3.2节所述: 虽然有一个单独的布尔类型,但任何方案 值可以用作布尔值,用于 条件测验。如第6.3节所述,所有值 在此类测试中,除#f外,均为真 #t是仅需要布尔值时返回的规范真值。方案标准是否定义真值的含义? 是的,

方案标准中是否定义了真值的含义?或者方案评估者的实施者是否可以选择将其定义为:
(define(true?x)(eq?x#t))

您可以定义这样一个函数,但最好使用

(define (true? x)
  (not (eq? x #f)))
这与所有内置条件操作的逻辑相匹配。如第3.2节所述:

虽然有一个单独的布尔类型,但任何方案 值可以用作布尔值,用于 条件测验。如第6.3节所述,所有值 在此类测试中,除
#f
外,均为真

#t
是仅需要布尔值时返回的规范真值。

方案标准是否定义真值的含义? 是的,“真”的含义在Scheme中有很好的定义

有许多方案标准,但在所有这些标准中只有两个布尔对象;它们具有外部表示法
#t
#f
。R7RS还要求布尔对象具有可选的外部表示形式
#true
#false
。但是,在条件测试中,除了
#f
(对于R7RS,则
#false
)之外,所有值均为真。其他Lisp,尤其是Common Lisp,可能有不同的真实性概念

在所有标准方案值中,只有
#f
在 条件表达式。除了
#f
,所有标准方案值, 包括
#t
、对、空列表、符号、数字、字符串、, 向量和过程都算作true

尽管存在单独的布尔类型,但任何方案值都可以 在条件测试中用作布尔值。在一个 条件测试,在此类测试中,除
#f
。本报告使用“真”一词表示除
#f
之外的任何方案值,使用“假”一词表示
#f

R7RS 6.3布尔值:

true和false的标准布尔对象写为
#t
#f
。或者,它们可以写成
#true
和 分别为#false。然而,真正重要的是模式条件表达式(
if
cond
时)所表示的对象,
除非
)视为正确或错误

在所有方案值中,只有
#f
在条件值中计为false 表达。所有其他方案值,包括
#t
,均视为真

实现是否可以对True使用不同的定义? 还是方案评估者的实施者可以选择 定义为:
(定义(真x)(等式x#t))

任何方案标准中都没有定义
true?
谓词。在最常见的真/假值用例中,例如,在条件表达式中,OP示例中定义的此类谓词会产生误导:

>(定义(真x)(等式x#t))
>(真的?’())
#f
>(如“()
“是吗?我不希望这样”
“真的?这是我的期望”)
“是吗?我不希望这样”
上面的过程测试一个值是否为布尔值
#t
,但不测试它是否为真。任何未将所有非
#f
值(包括
#t
)视为真的实现都不是符合方案要求的实现。使用
true?
的OP定义来确定实现中“true”的含义的实现将是不合格的

可以定义
true?
如下:

>(定义(真?x)(非(非x)))
>(真的?’())
#t
>(对吗?#t)
#t
>(对吗?#f)
#f
这将回答值在条件表达式中测试为true还是false的问题

请注意,Scheme中还有一个
布尔?
谓词,用于测试值是否为布尔值:

>(对吗?#t)
#t
>(布尔?#t)
#t
>(对吗?0)
#t
>(布尔值?0)
#f
>(对吗?#f)
#f
>(布尔?#f)
#t

我对的读数表明真值定义为
#t
。虽然你当然可以定义
true
来表示相同的东西,但它是非标准的,并且规范不支持将
#t
重新定义为其他东西(或不允许)。Scheme中没有
true?
函数。@Barmar:编写一个很容易,如OP所示。请注意,除
#f
以外的任何值都被所有条件操作视为true。
(define(true?x)(eq?x#t))
定义了一个过程。这是一种价值,但不是真的;我们必须调用它来测试一个对象是否为真。表示可能不同,但它们的使用方式应该相同。实际数据。例如,元循环计算器可以将整数实现为列表(列表的长度是值),而底层实现可以使用硬件整数。在编写元循环计算器时,可以选择直接使用底层实现的多少,与您在评估器中定义的部分相比。哦,好的,谢谢。但是您如何更改真值的表示?