标签: factor-lang

如何停止递归?

代码的出现第1天需要以一种或那种形式循环一长串括号等((((())(())(((()))((.这个想法是(上升到一层,)下到一层,目标是打印

  1. 字符串中第一个索引,其中楼层编号为负数
  2. 找到字符串结尾时的最后一层.

使用for循环的命令式解决方案很简单(以Python为例):

def main():
    flr = 0
    basement = False
    for idx, elt in enumerate(text):
        flr += {
            "(": 1,
            ")": -1
        }.get(elt)

        if flr < 0 and not basement:
            print("first basement pos:", idx + 1)
            basement = True

    print("final floor:", flr)
Run Code Online (Sandbox Code Playgroud)

递归函数解决方案稍微复杂一点,但仍然不太难.

def worker(flr, txt, idx, basement):
    flr += {"(": 1, ")": -1}[ txt[0] ]

    if not (len(txt) - 1): return flr

    if flr < 0 and not basement:
        print("first …
Run Code Online (Sandbox Code Playgroud)

recursion functional-programming declarative factor-lang

6
推荐指数
1
解决办法
227
查看次数

将引用保留为因子中的元组成员

我希望保留引用作为因子中元组的成员.但是当我尝试对它执行'call'时,我得到错误'无法将调用应用于运行时计算值'.请注意,将函数标记为"内联"不会执行任何操作.

示例代码:

USING: accessors kernel ;
IN: stackoverflow

TUPLE: quottuple quot ;
C: <quottuple> quottuple

: call-quot ( quottuple -- result )
    quot>> call ; inline

: main ( -- )
    [ 1 ] <quottuple>
    call-quot drop ;

MAIN: main
Run Code Online (Sandbox Code Playgroud)

factor-lang

5
推荐指数
1
解决办法
197
查看次数

使用 Factor 源代码树之外的代码

我正在尝试开始使用因子。

到目前为止,我已经:

  • 下载了 OSX 磁盘映像
  • 将因子目录复制到 $INSTALL/factor
  • 通过运行启动调试器 $INSTALL/factor/factor

这似乎运行良好。

按照编写第一个因子程序的说明,我注意到scaffold-vocab在我的$INSTALL/factor/work目录中生成了文件。我现在可以使用它,但总的来说,我喜欢保留一个单独的$INSTALL目录树和$CODE目录树。

所以我试图按照“使用因子目录树之外的代码”文档中的说明将其他目录添加到用于将代码加载到factor可执行文件的路径中,但我运气不佳。

首先,我尝试设置一个FACTOR_ROOTS环境变量:

% export FACTOR_ROOTS=.:$CODE/Factor:$INSTALL/factor
% $INSTALL/factor/factor
( scratchpad ) "work" resource-path .
"/usr/local/src/factor/work"
( scratchpad ) ^D
Run Code Online (Sandbox Code Playgroud)

然后,我尝试创建一个~/.factor-roots文件

% echo . > ~/.factor-roots
% echo $CODE/Factor >> ~/.factor-roots 
% echo $INSTALL/factor >> ~/.factor-roots
% $INSTALL/factor/factor        
( scratchpad ) "work" resource-path .
"/usr/local/src/factor/work"
( scratchpad ) ^D
Run Code Online (Sandbox Code Playgroud)

然后我检查了它是否应该./.factor-roots改为:

% …
Run Code Online (Sandbox Code Playgroud)

path factor-lang

4
推荐指数
1
解决办法
312
查看次数

如何在 Forth(或 Factor)中编写应用程序?

我可能对探索像 Forth(或 Factor)这样的基于堆栈的语言感兴趣。我想看到的是如何从头开始逐步构建应用程序。我发现的教程是基本的,并没有帮助我理解更大的图景。在处理大量部件时,考虑如何管理堆栈是令人困惑的。

我一直认为(也许是错误的)学习语言的一个好方法是用它来编写Roguelike游戏。我很难弄清楚一个人如何在一堆东西上杂耍:迷宫、数十种生物、宝藏、角色统计数据等。

stack forth factor-lang

4
推荐指数
1
解决办法
898
查看次数

连接语言可以使用前缀表示法吗?

连接语言具有一些非常有趣的特性,例如能够组合不同元数的函数以及能够分解出函数的任何部分。然而,许多人因为它们使用后缀表示法并且难以阅读而忽略它们。另外,波兰人可能不欣赏人们反向使用他们精心制作的符号。

那么,是否有可能有前缀符号?如果是这样,权衡是什么?

我知道它是如何工作的,但我没有使用连接语言的经验,所以我可能遗漏了一些东西。基本上,一个函数会以相反的顺序进行评估,而值会以相反的顺序从堆栈中取出。为了证明这一点,我将后缀与前缀的外观进行比较。以下是一些使用传统后缀表示法的连接表达式。

5 dup *                             ! Multiply 5 by itself
3 2 -                               ! Subtract 2 from 3
(1, 2, 3, 4, 5) [2 >] filter length ! Get the number of integers from 1 to 5
                                    ! that are greater than 2
Run Code Online (Sandbox Code Playgroud)

表达式从左到右计算:在第一个示例中,5被压入堆栈,然后dup复制堆栈顶部的值,然后将堆栈*顶部的两个值相乘。函数首先从堆栈中取出最后一个参数:在第二个示例中,当-被调用时,2位于堆栈顶部,但它是最后一个参数。

这是我认为前缀符号的样子:

* dup 5
- 3 2
length filter (1, 2, 3, 4, 5) [< 2]
Run Code Online (Sandbox Code Playgroud)

表达式从右到左计算,函数首先从堆栈中取出它们的第一个参数。请注意前缀过滤器示例如何与其描述更接近,并且看起来与应用样式相似。我注意到的一个问题是,将事情分解出来可能没有那么有用。例如,在后缀表示法中,您可以从中提取2 -出来3 2 -创建一个减法函数。在前缀表示法中,您可以从中提取 …

programming-languages postfix-notation concatenative-language factor-lang

3
推荐指数
1
解决办法
1214
查看次数