【问题标题】:Write `4 : '$ x (<") y'` tacitly默写 `4 : '$ x (<") y'`
【发布时间】:2020-09-08 13:45:32
【问题描述】:

如何默写frame函数? (来自“学习 J”第 7 章)

我正在使用 Ch 8 中的 f x g y = x f@:g y 组合方案,但它不起作用。我的猜测是因为&lt;" 没有自然排名?

x=.1
y=.i.2 3 4
f=.$
g=.<"

frame_e=.4 :'f x g y'
frame_t=.f@:g
x frame_e y         NB. -> 2 3, which is the x-frame of y
x frame_t y         NB. -> domain error

NB. No natural rank
g b.0               NB. -> syntax error
0 g b.0             NB. -> 0 0 0

我确认该模式与其他功能一样正常工作。

x=.1
y=.i.2 3 4
f=.+/
g=.*

f x g y             NB. -> equiv of 12+2*i.3 4
x f@:g y            NB. -> same

【问题讨论】:

    标签: j


    【解决方案1】:

    默认情况下,我会使用

       framet=. {. $
       2 framet i. 2 3 4
    2 3
    

    但这并没有真正触及你问题的根源,是吗?

    问题实际上是g 的定义方式:

    g=.<"
    

    这不会使g 成为动词,而是副词。它确实使用显式定义中的x 来创建动词,但它需要在使用该动词来评估y 之前执行此操作。据我所知,J 不允许您分阶段执行这些过程。正如您所见,当 fg 实际上是动词时,该模式确实有效。

    我觉得隐性编程很优雅,但在某些事情上它可能会比较慢,并且有些地方它是有限的。

    希望有人能提供更好的答案,让我也可以学习。

    【讨论】:

    • debug/dissect 为@: 版本指出了这个问题:domain error: operands to @: must be verbs
    • 额外的解释非常有帮助。我会尽量确保我的默认定义只包括那些简化为实际动词的东西。
    • 默示动词什么时候可以变慢?如果问题在 Learning J 或 JforC 中涵盖,那么不用担心;我会尽快解决的。 (;
    • 您几乎必须不时使用timespacex 检查您的定义,timespacex 是一个动词,以字符列表作为右参数,整数 n 作为左参数并返回平均时间n 次重复执行的字符列表和以字节为单位的空间。大多数情况下,我认为它发生在没有为某些默认组合编写特殊代码时。
    • 谢谢,鲍勃。我昨天刚遇到特殊代码/特殊组合。我一定会通过timespacex运行短语。
    猜你喜欢
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 2015-11-06
    • 1970-01-01
    相关资源
    最近更新 更多