问题标签 [tacit-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
j - 阅读 J 代码的最佳策略
我已经使用 J 几个月了,我发现阅读不熟悉的代码(例如,我不是自己编写的)是该语言最具挑战性的方面之一,尤其是当它处于默认状态时。一段时间后,我想出了这个策略:
1)将代码段复制到word文档中
2)从(1)中取出每个运算符并将其放在单独的行上,以便垂直读取
3) 用词汇页面中的语言描述替换每个运算符
4)从J语法粗略翻译成英语语法
5) 使用翻译来识别概念上相关的组件并用换行符分隔它们
6)用简单的英语散文描述(5)中的每个组件应该做什么
7) 根据 (6) 写出整个程序应该做什么的描述
8) 解释为什么(1)中的代码可以说代表(7)中的设计概念。
虽然我从这个过程中学到了很多东西,但我发现它相当费力和耗时——尤其是如果有人使用我以前从未遇到过的概念来设计他们的程序。所以我想知道:J 社区中的其他人是否有最喜欢的方式来找出晦涩的代码?如果是这样,这些方法的优点和缺点是什么?
编辑:
我需要分解的代码示例如下:
我自己写了这个,所以我碰巧知道它需要一个数字输入,将其重新解释为三元数组,并将结果解释为以 base-2 表示的数字,最多有一个重复。(例如,binconv 5 = (3^1)+2*(3^0) -> 1 2 -> (2^1)+2*(2^0) = 4。)但是如果我偶然发现它没有任何先前的历史或文档,弄清楚这就是它所做的事情将是一项不平凡的工作。
algorithm - J:冒泡排序默认实现中的自引用
由于我是 J 的初学者,我决定使用这种语言解决一个简单的任务,特别是实现冒泡排序算法。我知道在函数式语言中解决此类问题并不是惯用的,因为在 C 等命令式语言中使用数组元素转置自然地解决了它,而不是在声明性语言中构造修改后的列表。然而,这是我写的代码:
这是语句的结构:
让我们将其应用于数组:
让我感到困惑的是$:
指最外面的括号内的陈述。帮助说:
$:
表示包含它的最长动词。
另一本书(~300 KiB)说:
上述短语中加号和 时间的+ 和 * 等符号称为动词,表示功能。J 短语中可能有多个动词,在这种情况下,它就像简单英语中的句子一样,从左到右阅读,即 添加到后面的任何内容,
4+6%2
即除以。4
6
2
让我们重写我的代码片段,省略最外层()
:
结果是一样的。我无法解释自己为什么这样有效,为什么 only((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
被视为最长的动词$:
而不是整个表达式((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#) ^: #
,而不仅仅是(<./@(2&{.)), $:@((>./@(2&{.)),2&}.)
,因为如果((<./@(2&{.)), $:@((>./@(2&{.)),2&}.)) ^: (1<#)
是动词,它还应该在与 连词后形成另一个动词#
,即一个人可能会对待整个句子(第一个片段)作为动词。一个连词限制的动词长度可能有一些限制。
看下面的代码(从这里):
factorial
within 表达式是指整个函数,即(* factorial@<:) ^: (1&<)
.
在此示例之后,我使用了函数名称而不是$:
:
我希望bubblesort
引用整个函数,但对我来说似乎并不正确,因为结果是正确的。
如果您有其他实现,我还想看看其他实现,甚至稍微重构。
谢谢。
f# - 使用 F# 的隐性编程风格
这不是一个实际重要的问题,但我希望看到一个F# 中的默认编程示例,其中我的无点函数可以有多个参数(不是列表或元组的形式)。
其次,这些函数如何操作复杂的数据结构。我正在 F# Interactive 中尝试,但还没有成功。
例如,我尝试过:
这是正确的方式吗?
和:
j - 如何过滤J中的列表?
我目前正在学习迷人的 J 编程语言,但我无法弄清楚的一件事是如何过滤列表。
假设我有任意列表3 2 2 7 7 2 9
,我想删除 2s 但保持其他所有内容不变,即我的结果将是3 7 7 9
. 我到底该怎么做?
j - 如何定义一个单子函数来处理 J 中的列表?
假设我有以下 J 表达式:
这计算了 1 到 1000 之间可以被 3 整除的数字的数量。(现在,在有人指出有更简单的方法之前,这个问题是关于J 的语法,而不是数学。)
假设我为此定义了一个单子函数,如下所示:
这适用于单个参数,例如,
如果我传入一个列表,我会收到一个长度错误:
现在,我完全理解了为什么会出现长度错误。当您将列表替换为monad1 2 3
的参数时,您会得到:y
如果您对 J 有所了解,就会很清楚为什么会发生长度错误。所以,我不需要解释。
我想定义这个函数,这样当我传递一个列表时,它会返回一个列表,例如,
我怎样才能(a)重新定义这个函数来获取一个列表并返回一个列表,或者(b)让函数按原样在列表上工作而不被重新定义,也许使用一些副词或其他技术?
tacit-programming - 在 J 中设置用户自定义动词的等级
这是一个计算 J 中数字的数字和的函数:
如果我用b.
查询这个动词的等级,我得到_ 1 _
,即无穷大。(我们可以忽略二元的情况,因为digitalSum
它不是二元的。)
我希望这个动词的一元等级为 0,如b.
. 我知道这样做的唯一方法是使用“垫片”,例如,
这很好用,但我想知道这是否是唯一的方法,或者我是否还缺少其他东西。
澄清
我刚刚发现如何更改这样定义的动词的等级:
注意声明"0
后的3 : 0
. 你可以放任何你想要的副词或连词,它会作为一个整体应用于动词。很酷的东西!
tacit-programming - 在 J 中抽象盒装数组结构
我一直在研究一个 J 函数,它应该扫描一个列表并将一个元素的连续副本放入单独的连接框中。我的努力已经把我带到了功能
(<;. 2) ((2&(~:/\)),1:)
它测试连续列表条目的不等式,返回布尔值列表,并将列表切割成每次出现数字 1 时结束的框。这是一个示例应用程序:
如果我可以用输入参数中的相应值替换所有这些布尔值,那么任务就完成了。我一直在寻找某种神秘的功能,可以让我做类似的事情
在理想情况下,将有某种方法可以抽象地表示由生成的嵌套模式(<;. 2) ((2&(~:/\)),1:)
并将其应用于原始输入列表。(即“这里的装箱数组的第一个元素在深度一装箱,第二个元素在深度一装箱,第三、第四和第五个元素在深度一装箱......,所以把那个未装箱的列表放在那里并以相同的方式将其装箱。”)我尝试使用;.
, S:
, L:
,L.
和&.
产生这种行为,但我没有太多运气。是否有某种我缺少的运算符或原则可以使这种情况发生?如果我过度思考整个问题,我不会感到惊讶,但我已经没有想法了。
编辑:
目前,我唯一可行的解决方案是这个:
这是一个两步过程,生成列表的游程编码,然后撤消编码而不删除框。由于我最初这样做的目的是使用 J 和 Haskell 一起解决99 个问题,所以如果我通过首先解决问题 12 来解决问题 9,感觉就像在乞求这个问题。
tacit-programming - 如何在 J 中定义一个动词,将不同的动词交替应用于列表中的每个原子?
想象一下,我在 J 中定义了以下名称:
如下所示:
我想创建一个等级为 1 的一元动词,该动词适用于此列表列表中的每个列表。它将加倍 ( +:
) 或将 1 ( >:
) 添加到列表中的每个备用项目。如果我们将此动词应用于第一行,我们会得到2 3 6 5 10
.
获取与每个项目交替的布尔值列表相当容易,例如,0 1 $~{:$ m
给我们0 1 0 1 0
。我想,啊哈!+:
我将使用`之类的东西,>: @.
后跟一些表达式,但我永远无法让它发挥作用。
有什么建议么?
更新
以下似乎可行,但也许它可以被 J pro 重构为更优雅的东西。
tacit-programming - 如何在 J 中惯用地生成罗兰素数序列?
如果您不熟悉 Rowland 素数序列,可以在此处找到相关信息。我在 J 中创建了一个丑陋的程序单子动词来生成该序列中的前n 个术语,如下所示:
这非常有效,它确实生成了序列中的前n项。(通过n项,我的意思是前n 个 不同的素数。)
这是输出rowland 20
:
我的问题是,我怎样才能用更惯用的 J 来写这个?我不知道,尽管我确实编写了以下函数来查找数字列表中每个连续数字之间的差异,这是必需的步骤之一。就是这样,尽管它也可能由比我更有经验的 J 程序员重构: