代码的出现第1天需要以一种或那种形式循环一长串括号等((((())(())(((()))((.这个想法是(上升到一层,)下到一层,目标是打印
使用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) 我希望保留引用作为因子中元组的成员.但是当我尝试对它执行'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) 我正在尝试开始使用因子。
到目前为止,我已经:
$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) 我可能对探索像 Forth(或 Factor)这样的基于堆栈的语言感兴趣。我想看到的是如何从头开始逐步构建应用程序。我发现的教程是基本的,并没有帮助我理解更大的图景。在处理大量部件时,考虑如何管理堆栈是令人困惑的。
我一直认为(也许是错误的)学习语言的一个好方法是用它来编写Roguelike游戏。我很难弄清楚一个人如何在一堆东西上杂耍:迷宫、数十种生物、宝藏、角色统计数据等。
连接语言具有一些非常有趣的特性,例如能够组合不同元数的函数以及能够分解出函数的任何部分。然而,许多人因为它们使用后缀表示法并且难以阅读而忽略它们。另外,波兰人可能不欣赏人们反向使用他们精心制作的符号。
那么,是否有可能有前缀符号?如果是这样,权衡是什么?
我知道它是如何工作的,但我没有使用连接语言的经验,所以我可能遗漏了一些东西。基本上,一个函数会以相反的顺序进行评估,而值会以相反的顺序从堆栈中取出。为了证明这一点,我将后缀与前缀的外观进行比较。以下是一些使用传统后缀表示法的连接表达式。
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