将注释字符串转换为sicstus-prolog中的ASCII字符列表

时间:2016-06-21 07:44:36

标签: unix prolog sicstus-prolog

目前我正在研究SICStus3和SICStus4之间的比较,但是我遇到了一个问题,即SICStus4不会参考任何注释字符串具有托架控件或制表符等的情况,如下所示。

下面给出的示例案例。它有3个带逗号分隔符的参数。

case('pr_ua_sfochi',"
Response:
answer(amount(2370.09,usd),[[01AUG06SFO UA CHI Q9.30 1085.58FUA2SFS UA SFO Q9.30 1085.58FUA2SFS NUC2189.76END ROE1.0 XT USD 180.33 ZPSFOCHI 164.23US6.60ZP5.00AY XF4.50SFO4.5]],amount(2189.76,usd),amount(2189.76,usd),amount(180.33,usd),[[fua2sfs,fua2sfs]],amount(6.6,usd),amount(4.5,usd),amount(0.0,usd),amount(18.6,usd),lasttktdate([20061002]),lastdateafterres(200712282]),[[fic_ticketinfo(fare(fua2sfs),fic([]),nvb([]),nva([]),tktiss([]),penalty([]),tktendorsement([]),tourinfo([]),infomsgs([])),fic_ticketinfo(fare(fua2sfs),fic([]),nvb([]),nva([]),tktiss([]),penalty([]),tktendorsement([]),tourinfo([]),infomsgs([]))]],<>,<>,cat35(cat35info([])))
.
02/20/2006 17:05:10 Transaction 35 served by static.static.server1 (usclsefat002:7551) running E*Fare version $Name: build-2006-02-19-1900 $

",price(pnr(
        user('atl','1y',<>,<>,dept(<>,'0005300'),<>,<>,<>),
        [
                passenger(adt,1,[ptconly(n)])
        ],
        [

segment(1,sfo,chi,'ua','<>','100',20140901,0800,f,20140901,2100,'737',res(20140628,1316),hk,pf2(n,[],[],n),<>,flags(no,no,no,no,no,no,no,no,no)),

segment(2,chi,sfo,'ua','<>','101',20140906,1000,f,20140906,1400,'737',res(20140628,1316),hk,pf2(n,[],[],n),<>,flags(no,no,no,no,no,no,no,no,no))
        ]),[
                rebook(n),
                ticket(20140301,131659),
                dbaccess(20140301,131659),
                platingcarrier('ua'),
                tax_exempt([]),
                trapparm("trap:ffil"),
                city(y)
        ])).

以下谓词将删除上述案例中的评论部分。

flatten-cases :-
        getmessage(M1),
        write_flattened_case(M1),
        flatten-cases.
flatten-cases.
write_flattened_case(M1):-
        M1 = case(Case,_Comment,Entry),!,
        M2 = case(Case,Entry),
        writeq(M2),write('.'),nl.
getmessage(M) :-
        read(M),
        !,
        M \== end_of_file.
:- flatten-cases.

现在我的要求是将注释字符串转换为ASCII字符列表。

1 个答案:

答案 0 :(得分:2)

除了常规空格之外的布局字符不能在带引号的原子或双引号列表中字面上出现。这是ISO标准的要求,并且自3.9.0使用选项--iso调用SICStus 3以来在SICStus中完全实现。由于SICStus 4仅支持ISO语法。

您需要相应地插入\n\t。而不是

log('Response:
    yes').     % BAD!

现在写

log('Response:\n\tyes').

或者,为了使其更易读,请使用延续转义序列:

log('Response:\n\
\tyes').

请注意,使用文字制表符和文字换行符存在很大问题。在打印输出上你看不到它们!想想'A \nB',它不会显示尾随空格或尾随制表符。

但是还有许多其他情况,例如:制作程序文本的屏幕截图,制作程序文本的照片,使用3270终端仿真器并复制输出。在过去,穿孔卡。阅读文件时的文本模式(最初是由穿孔卡片驱动的)。类似的论据适用于制表师,它来自打字机及其可手动设置的制表位。

然后在SO上输入TAB非常困难。浏览器拒绝输入(非常明智),如果你将其复制,你会把它渲染为空格。

如果我在这,还有另一个问题。名称flatten-case应该写成flatten_case