使用测试工具进行调试

时间:2017-05-08 10:34:13

标签: debugging testing forth

我想使用简单的测试工具在调试期间使用与John Hayes开发的Forth test harness相同的方法测试我的代码。

概念是定义一个函数,比如说my+,然后定义简单的代码片段,它将在Tdebug开启时测试代码。

Tdebug if T{ 1 1 my+ -> 2 }T else

是否真的如同包含tester.f并将{>更改为T{}更改为}T一样简单?

如果尺寸有问题,我打算在生产版本中省略tester.f

编辑:

debug if ... then不起作用,因为它在编译之外......

现在我需要帮助!

如果debug为true 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
;

2 个答案:

答案 0 :(得分:1)

唯一的方法是将输入源流解析为}t。如果t{可以嵌套,则会变得有点棘手 - 请参阅[ELSE]字的reference implementation

作为参考,标准Forth中的简单(非嵌套)案例的t{字的生产模式定义:

: 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”文件)。在这种情况下,您根本不需要另外(生产模式)定义t{字。

答案 1 :(得分:0)

我最终做了类似于@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

我发现将测试作为生产文件中的使用注释有助于明确。