HSP

HSPで『かえるのがっしょう』の輪唱

A『かえるのうたが』
A『きこえてくるよ』B『かえるのうたが』
A『クワ クワ クワ クワ』B『きこえてくるよ』C『かえるのうたが』
A『ケケケケケケケケ』B『クワ クワ クワ クワ』C『きこえてくるよ』
A『クワクワクワ』B『ケケケケケケケケ』C『クワ クワ クワ クワ』
A『』B『クワクワクワ』C『ケケケケケケケケ』
B『』C『クワクワクワ』
C『』

せっかくHSPでコルーチンが使えるのでいいネタはないかなぁと思いついた題材。
なんともくだらないけど、コルーチンオブジェクトを複数独立させてそれっぽいプログラムができた。
HSPなら音源付きでも同じようなことできるかも。
コルーチンとかイテレータ的な性質をフルに生かせている気がして大変満足。

#runtime "hsp3cl"
#cmpopt varinit 1

#module __Caelin co,value,user
    #define yieId(%1="") value=%1: newlab co,1: return
    #modcfunc ceNextValue
        gosub co: return value
    #define global Caelin(%1,%2) dimtype %1,5 :newmod %1,__Caelin,%2

    #modinit str _user
        user=_user
        newlab co,1: return
        yieId user+"『かえるのうたが』"
        yieId user+"『きこえてくるよ』"
        yieId user+"『クワ クワ クワ クワ』"
        yieId user+"『ケケケケケケケケ』"
        yieId user+"『クワクワクワ』"
        yieId user+"『』"
        value=""
    return
#global

#module Program
    #deffunc main
        Caelin usrA,"A"
        Caelin usrB,"B"
        Caelin usrC,"C"

        repeat 10
            lin=ceNextValue(usrA)
            if 1<=cnt: lin+=ceNextValue(usrB)
            if 2<=cnt: lin+=ceNextValue(usrC)
            mes lin
        loop
    return
#global
main

イテレータならforeach文で回したいなぁとも思うのでマクロでそれっぽいループ文を実装した。

#runtime "hsp3cl"
#cmpopt varinit 1

#module __Caelin co,value,user
    #define yieId(%1="") value=%1: newlab co,1: return
    #define endCo value=ceNull:return
    #modcfunc ceNextValue
        gosub co: return value
    #define global Caelin(%1,%2) dimtype %1,5 :newmod %1,__Caelin,%2

    #define global ceNull "__ceNull__"
    #define global ceForCaelin(%1,%2) %tceForeach Caelin %i,%2: ceForeach %1,%o
    #define global ceForeach(%1,%2) %tceForeach *%i: %1=ceNextValue(%2): if ceNull=%1:goto*%i
    #define global ceBreak %tceForeach goto*%p0
    #define global ceContinue %tceForeach goto*%p1
    #define global ceLoop %tceForeach goto*%p1: *%o%o0

    #modinit str _user
        user=_user
        newlab co,1: return
        yieId user+"『かえるのうたが』"
        yieId user+"『きこえてくるよ』"
        yieId user+"『クワ クワ クワ クワ』"
        yieId user+"『ケケケケケケケケ』"
        yieId user+"『クワクワクワ』"
        yieId user+"『』"
    endCo
#global

#module Program
    #deffunc main
        Caelin usrA,"A"
        ceForeach v,usrA
            mes v
        ceLoop
        mes
        ceForCaelin v,"B"
            mes v
        ceLoop
    return
#global
main