generator에서 hubot을 대화식으로 만들기

Node.js의 0.12에서 ES6의 generator를 사용할 수 있게 되어 있으므로 공부.
올바른 사용법은 모르지만 hubot에서 사용하면 대화 모드 바람이된다.

코드



calendar.coffee
module.exports = (robot) ->
        cal = ->
                title = yield 'Creating a schedule. \nWhat?'
                attendees = yield 'With whom?'
                date = yield 'When?'
                while date == 'sat' or date == 'sun'
                        date = yield 'No meeting on weekend. When?'
                place = yield 'Where?'

                delete robot.cal
                'Set ' + title + ' with ' + attendees+ ' on ' + date + ' at ' + place  + '. Enjoy!'

        next_value = (input) ->
                robot.cal.next(input).value

        # respond block
        robot.respond /cal$/i, (msg) ->
                robot.ignore_input = true
                robot.cal = cal()
                msg.send(next_value())

        # hear block
        robot.hear /(.*)\s*$/i, (msg) ->
                if !('cal' of robot and robot.cal)
                        return
                if 'ignore_input' of robot and robot.ignore_input
                        delete robot.ignore_input
                        return
                msg.send(next_value msg.match[1])
  • generator는 robot.cal로 등록됩니다.
  • yield 에서 generator에서 호출자로 처리가 이동합니다.
  • generator가 존재하는 동안 hear마다 generator의 next가 호출된다.

  • 결과





    컴파일



    hubot의 거동 확인으로는 불필요하지만 처음에는 컴파일하면서 확인하는 것이 좋을지도 모른다.
    ht tp // こっふぇえ sc pt. rg/ 의 TRY COFFEESCRIPT에서도 가능하고 /path/to/coffee -c scripts/calendar.coffee 에서도 가능.yield 를 넣어두면 자동으로 generator( function* )가 생성되는 것이 미소.

    감상이라든가


  • 상태 머신처럼 상태와 그 네트워크를 잘 관리하는 것이 좋을 것입니다.
  • yield 그리고 next 그렇다면, 단순한 입력 대기와 같은 느낌으로 사용할 수 있어 간편
  • generator의 보존은 robot.brain 하지만 힘내면 할 수 있을 것 같았지만, 프로세스 재기동으로 확실하게 거동을 전환해 주었으면 하기 때문에 우선 robot 의 멤버로서 보았다(지속화할 정도의 데이터는 취급하지 않는 전제 )
  • 코드의 냄새
  • respondhear 가 복수 매치 하는 경우, 코드에 쓴 순서로 불린다. 쓰는 순서를 바꾸면 파괴됩니다
  • respond 바로 뒤에 hear 라고도 불리지만 그대로 return해 주었으면 하는, 같은 불필요한 의도의 코드가 들어간다
  • 되돌아 가거나 재실행하는 것이 몇 번 정도의 간단한 상태 천이이면 전망 좋고 컴팩트하게 맞는다.

  • 스테이트 패턴 잘 사용할 수 없을까?

  • 환경 구축



    본제가 아니다. 사용한 것은 이하의 버젼.
  • 그래서 @ 0.12.7
  • 코후에-sc 리 pt @ 1. 9.3
  • 후보 t @ 2.11.4
  • 후보 ts-c @ 3.3.0

  • 진짜로 generator를 유효하게 하는 곳에 사고팔고.
    배드 노하우 같은 움직임이 있기 때문에 제대로 한 절차로하는 것은 일단 후회한다.
  • 사용중인 coffee 실행 파일을 찾습니다.
  • coffee의 shebang에서의 node 호출시에 --harmony 옵션을 건네주고 싶지만, shebang에서는 파일명 이외의 인수를 건네줄 수 없었기 때문에 간접 파일을 만들어 호출한다.
  • $ vi /path/to/node-harmony
    #!/bin/bash
    /path/to/node --harmony "$@"
    
    
    $ vi /path/to/coffee
    #!/usr/bin/env /path/to/node-harmony
    

    (물론 패스를 통과해도 좋다고 생각한다)

    참고로 한 정보


  • CoffeeScript 1.9에서 generator 구문 지원
  • Node.js의 v0.12 때 harmony는 default가 되지 않는다는 결론이 되었습니다.
  • Run a node shell script in --harmony mode
  • 좋은 웹페이지 즐겨찾기