Debugging 使用测试线束进行调试

Debugging 使用测试线束进行调试,debugging,testing,forth,Debugging,Testing,Forth,我想使用一个简单的测试工具,在调试期间使用与John Hayes开发的方法相同的方法来测试我的代码 这个概念是定义一个函数,比如说my+,然后定义简单的代码片段,当Tdebug打开时,这些代码片段将测试代码 Tdebug如果T{1我的+->2}T其他 它真的像包含和更改{>到T{和}到}T那样简单吗 如果尺寸是一个问题,我计划在生产版本中省略tester.f 编辑: 如果。。。然后不起作用,因为它在编译之外 现在我需要帮助 如果调试为真tester.f工作正常 如果调试为false,t{和}t必

我想使用一个简单的测试工具,在调试期间使用与John Hayes开发的方法相同的方法来测试我的代码

这个概念是定义一个函数,比如说
my+
,然后定义简单的代码片段,当
Tdebug
打开时,这些代码片段将测试代码

Tdebug如果T{1我的+->2}T其他

它真的像包含和更改
{>
T{
}
}T
那样简单吗

如果尺寸是一个问题,我计划在生产版本中省略
tester.f

编辑:

如果。。。然后不起作用,因为它在编译之外

现在我需要帮助

如果调试为真
tester.f
工作正常

如果调试为false,
t{
}t
必须像
(…)
注释一样工作。如何编写此代码

0 constant debug
: t{
debug if
  ( as defined in tester.fr )
else
  ( what goes here? )
then
;
: }t
debug if
  ( as defined in tester.fr )
else
  ( and what goes here? )
then
;

唯一的方法是将输入源流解析到
}t
。如果
t{
可以嵌套,它会变得有点棘手-请参阅
[ELSE]
单词的说明

参考标准Forth中简单(非嵌套)情况下的
t{
word的生产模式定义:

: t{ ( "ccc }t" -- ) \ skip up to '}t'
  begin
    begin parse-name dup while S" }t" compare 0= until exit then 2drop
    refill 0= 
  until
;


尽管如此,我还是建议将测试放在单独的文件中,并有条件地包含这些文件(“spec”文件){word。

我最终做了一些类似于@ruvim的事情,在调试模式下包括tester.f,在生产模式下包括notester.f,如下所示:

\ notester.fs
( include either tester.fs or notester.fs )
\ adapted from longcomment.txt
false variable verbose
: t{ ( -- ) \ Long comment
  begin
    token  \ Get next token
    dup 0= if 2drop cr query token then \ If length of token is zero, end of 
                                        \ line is reached. 
                                        \ Fetch new line. Fetch new token.
    s" }t" compare  \ Search for }t
  until
  immediate 0-foldable
;
: testing  ( -- )                                            \ Talking comment.
source verbose @
if dup >r type cr r> >in !
else >in ! drop [char] * emit
then 
;
t{ 1 1 + -> 2 }t                                             \ Usage sample

我发现在生产文件中将测试作为用法注释有助于澄清。

比较之后,您似乎错过了
0=
(因为它应该在相等的字符串上返回0)。此外,在
的情况下,您可能会得到异常或无限循环在文件末尾找不到t
。@ruvim代码在Mecrisp中没有
0=
的情况下工作正常。我记不起缺少
}t
会导致意外问题,但我会检查。哦,我明白了。在
中,直到
中“只要长标志为真,循环”。它与标准Forth中的相反。这在Mecrisp中是非常糟糕的做法。@ruvim…循环只要为true…只是一个文档错误。我怀疑
compare
为相等字符串返回true。skvery,在这种情况下,它与标准Forth中的相反。-这不是更好的;)