哪些编程语言中if与函数调用语法无差异?
哪些编程语言中,带else分支的if条件块在语法上与函数调用完全一致?
核心问题:寻找能定义an_alternative_if_function函数,使其可以和原生if...else结构完全互换调用的编程语言——也就是说,从代码语法层面看,if和普通函数没有任何区别。
反例:Ruby
Ruby的单分支if看起来类似函数调用,比如:
if(a > 20){ puts("A is greater than 20.") }
可以用自定义函数模拟单分支逻辑:
def an_alternative_if_function(condition) yield if condition end an_alternative_if_function(a > 20){ puts("A is greater than 20.") }
但Ruby不符合要求,因为自定义函数无法支持else分支的语法,以下写法属于错误语法:
an_alternative_if_function(a > 20){ puts("A is greater than 20.") } else { puts("A is not greater than 20.") }
错误猜测:Lisp
之前误以为Lisp符合要求,因为它的if写法看起来像接收三个参数的函数:
(if (> a 20) (write-line "A is greater than 20.") (write-line "A is not greater than 20."))
但实际上这一猜测不正确——Lisp的if是特殊运算符,并非普通函数,无法通过自定义函数完全复刻其语法行为。
符合要求的语言
1. Smalltalk
Smalltalk的语法完全基于消息发送(可理解为函数调用),ifTrue:ifFalse:就是布尔对象的一个方法,原生if逻辑本质就是消息调用:
(a > 20) ifTrue: [Transcript show: 'A is greater than 20.'] ifFalse: [Transcript show: 'A is not greater than 20.']
你可以自定义一个完全等价的方法,比如:
Boolean>>myIfTrue: trueBlock ifFalse: falseBlock self ifTrue: trueBlock ifFalse: falseBlock // 调用时和原生写法完全一致 (a > 20) myIfTrue: [Transcript show: 'A is greater than 20.'] myIfFalse: [Transcript show: 'A is not greater than 20.']
从语法上看,自定义方法和原生ifTrue:ifFalse:没有任何区别,完全可以互换。
2. Self
Self是Smalltalk的衍生语言,同样基于纯消息传递模型,ifTrue:ifFalse:是布尔对象的方法,自定义函数可以完全复刻原生if的语法:
(a > 20) ifTrue: [Transcript print: "A is greater than 20."] ifFalse: [Transcript print: "A is not greater than 20."]
自定义等价方法后,调用语法和原生完全一致,没有区别。
内容的提问来源于stack exchange,提问作者sondra.kinsey
相关产品推荐
相关产品推荐

