越位规则
计算机程序设计术语
(重定向自Off-side規則)
越位規則(Off-side rule)是指程式語言中,用縮排來表示块结构的範圍。這名詞是來自Peter J. Landin,是足球中越位(offside)的雙關語。
定义编辑
越位规则,定义于Peter J. Landin在1966年叫做《The Next 700 Programming Languages》的文章中[1]:
这个规则被解读为是一种词法约定:任何非空白记号,当出现在上一行这种记号左侧之时,被接受为一个新宣布的开始[2]。
以Haskell语言的黄金规则为示例:作为某个表达式一部份的代码应该比这个表达式的开始处要缩排进去,即使这个表达式不是此行的最左元素。所有组合起来的表达式必须精确的对齐,在表达式的左侧的所有东西都被当作缩排,即使不是空白。当一个表达式的开始处不是一行的开始的时候,表达式的后续部分可以只比包含这个表达式开始的那一行要缩排进去。由花括号{...}
和分号;
组织起来的代码块可不采用越位规则。下面以将适用越位规则的do
控制结构嵌入if...then...else
为例:
if foothen do first thing second thing third thingelse do something_else
if foothen do first thing second thing third thingelse do something_else
if foothen do first thing second thing third thingelse do something_else
垂直对齐[注 1] 悬挂缩进[注 2] 悬挂缩进[注 3]
- 注释
程式範例编辑
以下是一個Python語言程式的例子,其中用縮排表示其程式區塊[3]:
def is_even(a: int) -> bool: """确定数a是否是偶数.""" if a % 2 == 0: print('偶数!') return True print('奇数!') return False
Python中括号内多行代码会隐式的接合在一起,也有着相应的缩排规则:
# 参数比后续部份多一层缩进def long_function_name( var_one, var_two, var_three, var_four): # 可选的圆括号内后续行多一层缩进,注意这里关键字在行首 if (this_is_first_thing and that_is_second_thing): do_something() # 可选的圆括号内后续行不额外缩进,同类语言元素垂直对齐 elif (this_is_third_thing and that_is_fourth_thing): do_something_different()# 悬挂缩进,参数比行首缩进一层spam = long_function_name( arg_one, arg_two, arg_three, arg_four)# 按开定界符垂直对齐eggs = long_function_name(arg_one, arg_two, arg_three, arg_four)#可选的闭括号位置my_list = [ 1, 2, 3, 4, 5, 6, ]# 可选的闭括号位置my_set = { 1, 2, 3, 4, 5, 6,}
实现编辑
越位规则可以在词法分析阶段实现,就像Python那样,在这里增加缩进导致词法器输出一个INDENT
记号,而减少缩进导致词法器输出一个DEDENT
记号[4]。这些记号分别对应于使用花括号表示块结构的语言中的开花括号{
和闭花括号}
,并且意味着短语语法不依赖于使用的是缩进还是花括号。这要求词法器保持状态,也就是当前的缩进层级,因而在缩进变更的时候可以检测到,因此这种词法文法不是上下文无关的,INDENT
/DEDENT
依赖于以前缩进层级的上下文信息。
遵循越位規則的語言编辑
编程语言编辑
其他语言编辑
參考資料编辑
- ^ Landin, P. J. The next 700 programming languages (PDF). Comm. ACM. March 1966, 9 (3): 157–166 [2020-10-11]. doi:10.1145/365230.365257. (原始内容 (PDF)存档于2010-06-20).
Indentation, used to indicate program structure. A physical ISWIM can be defined in terms of an unspecified parameter: a subset of phrase categories, instances of which are restricted in layout by the following rule called "the offside rule." The southeast quadrant that just contains the phrase's first symbol must contain the entire phrase, except possibly for bracketed subsegments. This rule has three important features. It is based on vertical alignment, not character width, and hence is equally appropriate in handwritten, typeset or typed texts. Its use is not obligatory, and use of it can be mixed freely with more conventional alternatives like punctuation. Also, it is incorporated in ISWIM in a systematic way that admits of alternatives without changing other features of ISWIM and that can be applied to other languages.
- ^ off-side rule for FOLDOC. [2020-10-11]. (原始内容存档于2021-01-20).
- ^ Python FAQ on colons. [2012-04-30]. (原始内容存档于2012-02-07).
- ^ Python Documentation (页面存档备份,存于互联网档案馆), 2. Lexical analysis (页面存档备份,存于互联网档案馆): 2.1.8. Indentation (页面存档备份,存于互联网档案馆)
- ^ The Haskell Report - Layout. [2012-04-30]. (原始内容存档于2012-03-31).
🔥 Top keywords: Baike: 首页Special:搜索胖猫跳江事件背着善宰跑九龍城寨之圍城逆天奇案2璩静淚之女王歌手2024Energy (組合)新生 (网络剧)习近平匈牙利邊佑錫劉俊謙 (香港)金智媛神耆小子塞尔维亚金秀賢 (男演員)母亲节猩球崛起:王國誕生九龍寨城馴鹿寶貝家族榮耀之繼承者Seventeen (組合)六四事件不夠善良的我們张维为楊佩潔TripleS支配物种庆余年郭葦昀洪若潭命案金惠奫2024年英雄联盟季中邀请赛春色寄情人BABYMONSTER笑看風雲乘風2024排球少年!!角色列表破墓徐巧芯中华人民共和国中華民國打天下2WIND BREAKER—防風少年—习明泽排球少年!!彭丽媛磁暴ILLIT贾斯汀·比伯逆天奇案BOYNEXTDOOR猿人爭霸戰:猩凶革命張書偉我的婆婆怎麼那麼可愛我獨自升級怪獸8號謝坤達IVE (組合)與鳳行關於我轉生變成史萊姆這檔事角色列表黃道十二宮福建號航空母艦虽然不是英雄葉乃文五月天張員瑛草榴社区張文傑2024年花蓮地震极光香緹·摩爾迷宮飯呂家愷搜查班長1958日本劉德華海莉·鮑德溫蕭景鴻越位 (足球)葬送的芙莉蓮周處除三害 (電影)毛泽东願榮光歸香港林峯周雨彤伍允龍羅毓儀香港Baike: 分類索引沒有秘密猩球崛起:終極決戰角質層唐振剛柯佳嬿文化大革命