Answers:
这可能是最重要的提示。几乎每个高尔夫Röda计划都使用下划线。
下划线语法是for
循环的语法糖。以下代码行是等效的:
ls""|fileLength x for x|sort|pull
ls""|fileLength _|sort|pull
每个下划线for
都会在语句周围的不可见循环中添加一个新变量。循环从流中为每个变量/下划线提取一个值,然后重复执行,直到没有剩余值为止。
下划线可以在语句中的任何位置使用:
a[x:y+1]=[1]*(1+y-x) /* Sets range x..y (inclusive) */
seq x,y|a[_]=1 /* 6 bytes less */
如果必须多次引用相同的下划线值,或者以相反的顺序使用这些值,则可以在下划线后放置一个数字:
a|[_^_1] /* maps x to x^x */
a|[_2-_1] /* maps each pair (x,y) to y-x, eg. [1,2,4,8] -> [1, 4] */
编写Röda代码时,通常建议使用换行符或分号分隔所有语句。但是,在打高尔夫球时,值得一提的是,并不是所有分号都需要。
这是分号/换行符可选的地方的不完整列表。他们中的大多数在下面的语句与运营商(开始不适用(
,[
,+
,等)。
f x
)或使用括号时(例如f()
)|
,)
,]
或者}
如果下一条语句以运算符开头,则分号/换行符是可选的,如果
{f(x)[y]}
与相同{f(x);[y]}
。这仅在语句上下文中有效,而在函数调用为表达式时无效。x=(y)[z]
与相同x=(y);[z]
(与相同x=((y)[z])
)。这是在某些地方需要换行的地方:
++
和--
。[...]
。通常可以通过重新组织分配来节省字节。例如:
a=0;b=""c=[""]
b=""c=[b]a=0
x=f()y=i;z=a[0]
x=f()z=a[0]y=i
不使用后缀语句几乎绝不是最佳选择,因为您可以使用{...}
代替do...end
。
一些例子:
x|unless[not(_ in y)]do[0]else[1]done
x|[0]unless[not(_ in y)]else[1]
if[p<0]do c+=p;a-=p done
{c+=p;a-=p}if[p<0]
if[_ in y]
代替吗?
括号在语句上下文中是可选的。即使自变量以运算符开头,这也适用。例如,[a()|sqrt-_]
比短[a()|sqrt(-_)]
。后面的括号a
是必需的,就像a
在表达式上下文中一样,而不是在语句上下文中。
但是,编写[a()|sqrt(_+1)*2]
是不可能的,并且需要额外的括号来帮助解析器:[a()|sqrt((_+1)*2)]
。通常可以重写这样的表达式,使它不以括号开头:[a()|sqrt 2*(_+1)]
[a()|atan2 _,_]
将被允许。
``
字符串在""
字符串中,必须转义某些字符才能使用它们。例如,要打印反斜杠,您将必须具有类似的字符串"\\"
。有一个增加的字节用于转义反斜杠。但是,如果使用``
,则不必转义此字符,可以节省一个字节。
print"\\" /* 9 bytes */
print`\` /* 8 bytes */
不仅如此,您还可以``
使用$variableName
或(字符串中${expression}
不存在的功能)对字符串内的变量和表达式进行编码""
。
在这些示例中,我们将输出"a"
与变量值连接在一起的字符串,并在b
结尾加上换行符。
["a",b," /* 11
"] bytes */
[`a$b /* 8
`] bytes; encodes b in the string using $b */