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
的第一个参数将被声明为type
ThreeToForty
而不是
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) {
        // ...
    }
}