然而当表达式涉及到函数调用时,表达式的求值在函数调用期间搁置起来。在函数调 用返回前,缓冲区不能清空。例如,在下面的语句中: LET charvar=numvar USING '###', myfunc() 临时空间用于文字串'###'和USING操作符的结果。这些被搁置的值在myfunc()函数调 用期间一直保留在串缓冲区中。如果在myfunc()函数和它的子函数求值期间用到的临 时串值总量超过了缓冲区的大小,就会发生这里的错误。
通过将函数调用分配在几个语句中,通常是可以避免上述错误的,如下面的例子: LET charvar=myfunc() LET charvar=numvar USING '###', charvar clipped 在调用第一个语句的函数myfunc()期间,串缓冲区是空闲的,当第二个语句执行完 后,串缓冲区又是空闲的。
CASE语句中WHEN子语句的缩减形式也会产生被搁置的字符表达式。下面例子中,在整 个函数func_A()和func_B()调用期间,临时串存贮空间将不予使用。 CASE charvar WHEN 'A' CALL func_A() WHEN 'B' CALL func_B() ...
WHEN子句的完整形式不会产生上述问题,因为字符表达式的求值在函数调用开始时就 结束了。 CASE WHEN charvar='A' CALL func_A() WHEN charvar='B' CALL func_B()