Your very own "for" instruction, redux Inspired by Sygmei's question, I'm interested in finding out what languages can "do this properly".

Your task is to write a "for loop" function / macro / instruction. The arguments should be: 


an initializer
a test
an increment
a body


All of these are "pieces of code" and should be able to access variables in the context of the call. The body should be able to include multiple statements.

The aim is to have the fewest lexical tokens excluding comments, except that #define and friends (using a dumb preprocessor) are worth 50, and eval and friends (taking a string argument) are worth 100. Feel free to make your code readable with comments, whitespace and meaningful names.

You should include a "test harness" which is not counted towards length.

The C version definitely won't win:

// the do {...} while (0) idiom enables a code block to be a single C statement, so it can safely be followed by a semicolon
#define my_for(init, test, inc, body) do {  \
    init; \
    while (test) { \
        body; \
        inc; \
    } \
} while (0)

// test harness:
#include &lt;stdio.h&gt;

main()
{
    int i, total;
    my_for((i=1, total=0), i&lt;=3, ++i, {printf("%d\n", i); total=total+i;});
    printf("total: %d\n", total);
}


Edit to add: the meaning of "lexical token" depends on your language. Here's how the scoring breaks down for my C version:

//[...]: 0
#define: 1 occurrence, 50 points
my_for: 1
(: 3
init: 2
,: 3
test: 2
inc: 2
body: 2
): 3
do: 1
{: 2
\: 6
;: 3
while: 2
}: 2
0: 1  

TOTAL: 85
Python, 11 26 tokens:

def f(n, t, i, l):
    n()
    while t():
        l()
        i()


This is my first time doing atomic-code-golf, so forgive me if I got the token counting wrong.

EDIT: Hugh Allen informed me that I got the token counting wrong.