“언제”진술과 같은 것이 있습니까? [닫은] 질문은 더

“언제”사례를 처리 할 수있는 언어 또는 언어 기능이 있습니까? 즉, 어떤 범위 나 컨텍스트에서 어떤 조건이 충족 될 때마다 추가 코드를 지정하여 실행할 수 있습니까?

if이는 특정 범위에 있고 명시 적으로 작성되어야 하는 simple 과 다릅니다 . 이 when 절은 if프로그램 실행 후 모든 경우에 적용되는 것과 거의 같습니다 .



답변

귀하의 질문은 명확하지 않지만 관찰자 패턴은 당신이 찾고있는 것 같습니다 http://en.wikipedia.org/wiki/Observer_pattern


답변

구문 현명한, 꽤 많은 언어에는 when키워드가 있지만 설명하는 방식으로 사용하는 언어는 알지 못합니다.

‘X가 발생하면 Y를 수행’패턴은 종횡비 프로그래밍의 핵심입니다. 선형 흐름을 정의하는 대신 핸들러를 특정 조건 (일명 ‘이벤트’에 가입)에 연결합니다. 이러한 종류의 프로그래밍은 프로그램의 핵심 루틴이 이벤트 디스패처 인 GUI 응용 프로그램에서 널리 사용됩니다.

일부 언어에는 언어 구문을 통해 이러한 메커니즘을 제공하는 광범위한 구문 기능이 있습니다. 예를 들어 델리게이트와 이벤트가있는 C #이 있습니다.

// 'when btnOK is clicked, run HandleOKClick'
btnOK.Clicked += this.HandleOKClick;

다른 언어는 OOP 구조 (Observer 패턴, 이벤트 리스너 등)를 사용합니다 .Java의 예 (내 Java는 약간 녹슨 편이므로 자유롭게 편집하십시오) :

Foobar f = this;
btnOK.registerClickHandler(
    new ClickHandler {
        public void handleClick(Event e) {
            f.handleOKClick(e);
        }
    });

또 다른 접근법은 평범한 오래된 콜백을 사용하는 것입니다. 자바 스크립트의 예 :

var btnOK = $('btnOK');
btnOK.click(handleOKClick);


답변

아직 아무도 INTERCALCOMEFROM에 대해 언급하지 않았습니다 .

COMEFROM은 처음에 농담 어셈블리 언어 명령어 목록 ( ‘CMFRM’)에서 발견되었습니다. 1973 년 R. Lawrence Clark의 Datamation 기사에서 Edsger Dijkstra의 Go Go Statement Statemented Harmedful에 대한 응답으로 작성되었습니다. COMEFROM은 결국 난해한 프로그래밍 언어 인 INTERCAL의 C-INTERCAL 변형에서 훨씬 더 모호한 ‘계산 된 COMEFROM’과 함께 구현되었습니다. ‘지정된 COME FROM’과 ‘DONT’키워드 (기존의 ‘DO’루프를 보완하기위한)에 대한 포트란 제안도있었습니다.

2004 년 4 월 1 일, Richie Hindle은 Python 프로그래밍 언어를 위해 GOTO와 COMEFROM을 모두 구현했습니다. 만우절에 릴리스되어 심각한 용도로 사용되지는 않지만 구문이 유효하며 구현이 완전히 작동합니다.


답변

Tcl 언어에는 변수가 설정되어 있거나 읽거나 삭제할 때마다 임의 코드가 실행될 수있는 변수에 대한 추적 이 있습니다. 이 임의의 코드에는 표현식을 평가하고 보유한 경우 일부 코드를 실행하는 것이 쉽게 포함될 수 있습니다. 주요 제약 조건은 로컬 변수에 대해이 작업을 수행 할 수 있지만 수명이 매우 짧은 경향이 있기 때문에 일반적으로별로 유용하지 않으므로 일반적으로 전역 및 네임 스페이스 변수로 제한됩니다. (Tcl에는 클로저가 없습니다.)

그러나이 작업을 수행하는 경우주의해야합니다. 공식적으로 재진입에 문제가 없지만 (몸이 실행되는 동안 추적이 비활성화 됨) 여전히 명확하지 않은 코드를 작성하고 많은 혼란을 유발하는 좋은 방법입니다. 성능 적중이 상당히 클 수 있으므로 루프 변수 (디버깅 제외)와 함께 사용하는 것은 정말 끔찍한 아이디어입니다.


위의 링크 된 매뉴얼 페이지의 코드를 기반으로 한 예를 보여줍니다.

set foo 1
set bar 2
proc doMult args {
    global foo bar foobar
    set foobar [expr {$foo * $bar}]
}
trace add variable foo write doMult
trace add variable bar write doMult
doMult

그 시점부터, $foo또는 $bar새로운 정수 $foobar가 될 때마다이 둘의 곱이됩니다. 자동으로.


또한 Tcl을 사용하면 명령 실행, 명령 삭제, 타이머, 소켓에서 사용할 수있는 데이터 등과 같은 다른 종류의 트리거에서 코드를 실행할 수 있습니다. Tk 라이브러리를 추가하면 전체적으로 큰 세트를 포함하도록 확장됩니다. GUI 이벤트도 마찬가지입니다. Tcl은 실제로 매우 강력한 이벤트 지향 언어라고 말할 수 있습니다 (이러한 기능을 전혀 사용하지 않는 코드를 쉽게 작성할 수있는 경우에도 마찬가지 임).


답변

이벤트 처리 같은 것?

func () 대신 이벤트 처리

당신은 이벤트가 기능을 할 때 말한다

아니면 특정 변수에 대한 콜백입니까?


답변

예, Perl에는 명령문 수정 자와 같은 키워드가 있습니다.

say 'Well done!'        when 'A';

또한 switch 문의 일부입니다.

given ($foo) {
    when (/^abc/) { $abc = 1; }
    when (/^def/) { $def = 1; }
    when (/^xyz/) { $xyz = 1; }
    default { $nothing = 1; }
}


답변

않습니다 이 ( COMEFROM위키 백과에 설명 문) 계산?

요약:

COMEFROM은 코드의 임의 지점에서 COMEFROM 문으로 실행 상태를 취할 수 있다는 점에서 GOTO와 반대입니다. 상태 전송이 발생하는 코드 포인트는 일반적으로 COMEFROM에 매개 변수로 제공됩니다. 전송이 지정된 전송 지점에서 명령 이전 또는 이후에 발생하는지는 사용 된 언어에 따라 다릅니다. 사용 된 언어에 따라 동일한 출발점을 참조하는 여러 COMEFROM이 유효하지 않거나 비 결정적이거나 정의 된 우선 순위로 실행되거나 스레드 인터 칼에서 볼 수 있듯이 병렬 또는 동시 실행을 유발할 수 있습니다.