在 J 中编写自定义动词

Writing custom verbs in J

编写自定义动词(函数)时应使用以下约定:

将华氏度转换为摄氏度。

   centigrade =: 3 : 0
t1 =. y - 32
t2 =. t1 * 5
t3 =. t2 % 9
)

或者,我看到了这个:

ftoc=:(5 % 9)* (-&*32)

是否有必要在第一个示例中使用 3 : 0y。 应该遵循哪些一般准则?

多行定义来自 Primer,旨在展示如何定义多行显式定义以及它们如何与调试器一起工作。这不是良好编程实践的示例。

有了一点经验你会写:

   f=: 3 : '9%~5*y-32'
   f _40 32 212
_40 0 100

这也可以默认完成(不显式使用 y)。

   g=: 13 : '9%~5*y-32' NB. get tacit from explicit 
   g
9 %~ 5 * 32 -~ ]
   g _40 32 100
_40 0 37.7778

引物中显示的格式(即缩进)是在终端中使用 3-space 缩进定义动词的结果(与脚本中的格式相反)。 以下是定义动词的多种方式。没有一个公认的“好风格”。 “最佳”方法可能取决于用例和用户偏好。

“经典”显式

f=: 3 : 0
  9 %~ 5 * y -32
)

显式引用了变量。适用于具有多个变量的更长、更复杂的动词。这里的关键symbol/primitive是连词:def。有关其形式的更详尽列表,请参阅 the JWiki page

新手友好显式

f=: verb define
  9 %~ 5 * y -32
)

与“经典”相同,但具有一些定义的名称以帮助提高可读性。

“字符串”显式

f=: 3 : '9 %~ 5 * y - 32'

显式的单行版本,但如果动词包含用单引号分隔的 strings/literals 会变得难看。也不适用于语法高亮器。

默契

f=: (5%9) * -&32
f=: 9 %~ 5 * 32 -~ ]   NB. alternative that ignores any left argument

也称为point-free style,默认动词不明确指代他们的论点。非常适合带有一个或两个参数的更小、更简单、定义明确的动词。在多次调用动词时性能更高,因为它只被解析一次。可能在明确定义中定义和使用。

直接定义

f=: {{ 9 %~ 5 * y -32 }}

Direct definition 是在 J9.02 中引入的。它是一种更简洁、更传统的显式定义语法,支持单行显式定义,可以很好地与语法高亮显示一起使用,以及更长、更复杂的带有嵌入式显式定义的动词。