13 :
记录在(Explicit)下的词汇表或NuVoc中。:
基本思想是你想x
成为的价值变成你想成为[
的价值。但是一旦最右边的记号从名词(值)变成动词,比如or ,整个语句就变成了火车,你可能需要使用动词或连词,或者恢复你之前的组合行为。y
]
[
]
[:
@
@:
您还可以将值替换为实际名称x
和y
,然后将整个内容包含在 ( (dyad : ' ... ')
) 中。那是:
>:?10#6 NB. Roll ten six sided dice.
可以变成:
10 (dyad : '>: ? x # y') 6 NB. dyad is predefined. It's just 4.
如果你只需要y
参数,你可以使用monad
,它被预定义为3
。名字verb
也是3
。verb :
当我同时提供一元和二元版本时,我倾向于使用monad
单子含义,并且只需要一元含义。
如果您的动词是这样的单行动词,您有时3
可以通过将or4
替换为 自动将其转换为默认形式13
。
我有一些关于在 j中分解动词的注释,可以帮助您逐步进行转换。
附录:用于将语句转换为默认 dyad 的伪代码
这仅涵盖单个语句(一行代码),如果您尝试提取的常量值被传递给连词或副词,则可能不起作用。
此外,该语句不得引用其他变量。
- 附加
[ x=. xVal [ y =. yVal
到声明中。
- 用适当的值代替
xVal
和yVal
。
x
用 new和重写原来的表达式y
。
- 改写
statement [ x=. xVal [ y=. yVal
为:
newVerb =: (4 : 0)
statement ] y NB. we'll fill in x later.
)
(xVal) newVerb yVal
x
现在你有了一个关于和的明确定义y
。将它放在多行而不是使用的原因x (4 : 'expr') y
是,如果expr
仍然包含字符串文字,您将不得不摆弄转义单引号。
转换第一个名词
由于你之前只有一个管道,所以里面最右边的表达式statement
必须是名词。使用以下规则将其转换为分叉:
y
→(])
x
→]x ([)
_
, __
, _9
... 9
→ (_:)
, (__:)
, (_9:)
...(9:)
n
→ n"_
(对于任何其他任意名词)
这使整体含义保持不变,因为您刚刚创建的动词会立即被调用并应用于[ y
.
无论如何,括号中的这个新的默认动词将成为您将构建的火车的核心。从现在开始,您通过使用语句中最右边的表达式并将其移动到括号内来工作。
叉形范式
从现在开始,我们将假设我们正在创建的默认动词始终是一个叉子。
这个新的默示动词实际上不是叉子,但我们会假装它是,因为任何单词元动词都可以使用以下规则重写为叉子:
v → ([: ] v).
没有理由实际进行这种转换,只是为了简化下面的规则并始终将其称为分叉。
我们不会使用钩子,因为任何钩子都可以通过以下规则重写为分叉:
(uv) → (] u [: v ])
下面的规则应该自动生成这种形式的火车。
转换剩余的令牌
现在我们可以使用以下规则来转换原始管道的其余部分,一次将一项移动到分叉中。
对于所有这些规则,(]x)?
不是 J 语法。这意味着]x
可能存在也可能不存在。在不改变代码含义的情况下] x
转换用法之前,您无法放入。x
转换 的实例后x
,]x
是必需的。
遵循 J 约定,u
andv
表示任意动词,andn
是任意名词。请注意,这些包括动词
tokens y u (]x)? (fork) ] y → tokens (]x)? (] u fork) ] y
tokens x u (]x)? (fork) ] y → tokens ]x ([ u fork) ] y
tokens n u (]x)? (fork) ] y → tokens (]x)? (n u fork) ] y
tokens u v (]x)? (fork) ] y → tokens u (]x)? ([: v fork) ] y
副词或连词没有规则,因为您应该将它们视为动词的一部分。例如 +:^:3
应该被视为单个动词。同样,括号中的任何内容都应单独保留为一个短语。
无论如何,继续应用这些规则,直到你用完令牌。
清理
你最终应该得到:
newVerb =: (4 : 0)
] x (fork) ] y
)
(xVal) newVerb yVal
这可以重写为:
(xVal) (fork) yVal
你完成了。