Input 是否有任何编程语言为参数的运行时输入检查提供语法糖?
我希望能够编写如下函数:Input 是否有任何编程语言为参数的运行时输入检查提供语法糖?,input,programming-languages,function-declaration,Input,Programming Languages,Function Declaration,我希望能够编写如下函数: print\u多次(Int(>3&&3&&foo以下是合同系统的一个示例: (define/contract (log10 x) (-> (>/c 0) real?) (/ (log x) (log 10))) 上面代码中的约定是这一行:(>/c 0)real?。箭头表示函数约定,该函数的参数约定后跟结果的单个约定。参数上的约定是(>/c 0),它检查参数是否是大于零的实数。结果上的协定是实数?,这是Racket的内置实数谓词。谓词可以在需要协定的
print\u多次(Int(>3&&3&&foo以下是合同系统的一个示例:
(define/contract (log10 x)
(-> (>/c 0) real?)
(/ (log x) (log 10)))
上面代码中的约定是这一行:(>/c 0)real?
。箭头表示函数约定,该函数的参数约定后跟结果的单个约定。参数上的约定是(>/c 0)
,它检查参数是否是大于零的实数。结果上的协定是实数?
,这是Racket的内置实数谓词。谓词可以在需要协定的任何地方使用。此外,正则表达式充当协定,接受它匹配的字符串。Racket有丰富的字符串库制作不同类型的合同
下面是一些使用该函数的好例子:
> (log10 10)
1.0
> (log10 250)
2.397940008672037
下面是一个违反合同的例子:
> (log10 -5.0)
; log10: contract violation
; expected: a number strictly greater than 0
; given: -5.0
; in: the 1st argument of
; (-> (>/c 0) real?)
; contract from: (function log10)
; ....
有关更多详细信息,请参阅
IIRC,Racket的契约系统部分灵感来自Eiffel,但我认为Racket的契约更具表现力,Eiffel契约因子类化而被打破。在提供隐式强制转换/类型转换的语言中,您可以定义在其构造函数上执行所需检查的类型,并使用装箱方法自动执行c从文字中提取ast
(未经测试)
class-Foo
{
公共食物(国际一)
{
if(!(i>3&&i)我认为您描述的是依赖类型。Pascal有子范围类型:typethreetoforty=[3..40]
;然后,print\u multiple\u times
的第一个参数将被声明为typeThreeToForty
而不是Int
。哇,这很方便!而且我实际上已经熟悉Racket了(虽然不知道这个特性)。我当然应该进一步研究它。
class Foo
{
public Foo(int i)
{
if (! (i > 3 && i <= 40)) {
throw ArgumentOutOfRangeException('i')
}
val = i;
}
public int val;
public static implicit operator int(Foo i)
{
return i.val;
}
public static implicit operator Foo(int i)
{
return new Foo(i);
}
public void print_multiple_times(Foo foo, string bar) {
// ...
}
}