2013-05-01 2 views
2

"for 루프"스타일 구문을 사용하여 함수를 만들 수 있습니까? 그리고 그렇다면, 그 스타일의 기능은 무엇이라고 불릴까요? 루프 예를 들어 a를 들어 for 루프 구문을 사용하여 함수 만들기

이 구문을 다음과

myFunction(x; y; z) 
{ 
    //do something 
} 
:

for(i = 0; i < 10; i++) 
{ 
    //do something 
} 

이 가능를 다음과 같이 호출 할 수있다 "myFunction이"라는 예를 들어 자신의 기능을 만들 수있는 어떤 언어에

당신은 단지 쿵푸를 만들 수 있습니다 일반적으로 프로그래밍 언어로

(대신 함수 입력을위한 쉼표의 세미콜론 다음 블록 래퍼를 주목하라) nction과 같이 호출 :

myFunction(input1, input2, input2); 

을 그래서 기본적으로 내가 입력을 받아들이는 기능, 세미콜론으로 구분하고 for 루프가하는 것과 같은 방식으로 코드 블록을 만들 수 있어야합니다. 이것이 가능한가? 이것은 무엇이라고 불 립니 까?

수정 - CLARIFICATION : 루프를 실행하는 바로 가기 기능을 쓰고 싶지 않습니다. 나는 구조적인 관점에서 보면, for 루프처럼 보인 함수를 작성하려고한다. 그러나, 만들어진 기능은 절대로 "for"또는 어떤 이유로 든 호출하지 않습니다.

편집 - "컴파일러"수준에서 구현할 수 있습니까? 나는 자바 스크립트에서 가장 가까운 것은 다음을 것 이해 (그러나 그것은에 관해서는 깨끗하지 않다) :

myFunction(x, y, z, function() 
{ 
    //do something 
}); 
+3

"아니, 그럴 수 없어"... –

+0

두 가지 프로그래밍 언어로 태그 ​​지정했습니다. 어느 분이 당신에게 묻고 있습니까? –

+1

정확히 원하는 이유를 설명 할 수 있다면 사람들에게 몇 가지 제안 사항이있을 수 있습니다. –

답변

1

에 코드

let mutable x = 0 
let somethingElse n = x <- x+n 
yourLoop 0 10 somethingElse 

설정 X. 자바, 파이썬, 자바 스크립트 및 다른 언어는이를 다양한 범위로 지원합니다. DSL에는 세미콜론으로 수행하고자하는 것과 같은 특별한 구문이 포함될 수도 있고, 정말 멋진 API (jQuery 생각하기)와 같은 간단한 구문 일 수도 있습니다. JavaScript는 사용자 정의 구문을 지원하지 않지만 언어는 실제로 표현력이 뛰어나며 영어처럼 읽는 API를 쉽게 만들 수 있습니다.

그렇다면 원하는 방식으로 코드를 작성한 다음 일종의 파서를 통해 실행하여 변환 할 수 있습니다. coffeescript의 출처를보아야합니다. 근본적으로 자신의 언어를 쓰고, 문법을 만들고, 구문 트리로 구문 분석하고, 코드를 번역하는 것에 익숙해야합니다.

내가 말했듯이 다른 언어는 고유 한 구문/DSL을 만들 수 있습니다. 여기에 일부 리소스는 다음과 같습니다
- http://www.slideshare.net/Siddhi/creating-domain-specific-languages-in-python
- http://www.jetbrains.com/mps/

가 개인적으로, 나는 당신이 구문을 사용자 정의 언제가이 프로젝트에서 작업 새로운 사람들을위한 매우 혼란 얻을 생각합니다. 그러나 어쩌면 당신이하는 일에 의미가있을 수도 있습니다.

3

음 ... 당신이 이미 말한대로 : 당신이 당신의 자신의 방법을 만들 수 있습니다,하지만 당신은 할 수 없습니다 키워드를 만드십시오. for은 그러한 키워드이고 키워드는 메소드가 수행하는 표준 규칙을 준수 할 필요가 없습니다.

MyForLoop(() => 0, i => i < 10, i => i + 1, i => Console.WriteLine(i)); 
+0

(var thing = value) {// block} 또는 switch (varname) {// block} – user1886419

+0

정렬을 사용하는 것과 같은 블록을 허용하는 함수를 작성할 수 있습니까? 나는 그 질문을 다시 게시하는 것이 좋습니다. 우리는이 질문에 대해 별개로 대답 할 수 있습니다. –

0

정확한 구문은 자바 스크립트로 할 수 없지만 어떤 의도 : 당신은 그것을 호출 할 수 있습니다

void MyForLoop<T>(Func<T> myInitialization, Func<T, bool> myCondition, Func<T, T> myIteration, Action<T> myBody) 
{ 
    // Check the arguments for null's. 
    T iterator = myInitialization(); 
    while(myCondition(iterator)) 
    { 
     myBody(value); 
     value = myIteration(value); 
    } 
} 

이 좋아하는 : 내가 생각할 수있는

가장 가까운 것은 이것이다 그러고 싶다. 최신 브라우저에서는 Array에 제공되는 forEach과 매우 유사합니다.

function myLooper(iterations, callback) { 
    for(var i = 0; i < iterations; ++i) { 
     callback(i); 
    } 
} 

myLooper(4, function(i) { 
    console.log(i); 
}); 

// outputs 
// 0 
// 1 
// 2 
// 3 

여기서는 fiddle입니다. 당신은 또한 C 번호와 함께이 태그 이후

은하고, 여기에 C# 버전입니다 :

void MyLooper(int iterations, Action<int> action) { 
    for(int i = 0; i < iterations; ++i) { 
     action.Invoke(i); 
    } 
} 

내가 지금 편리한 C#을 환경을하지 않으므로 위의 가능성이 매우 정확하지 않습니다.

0

당신은 C#에서 해결책을 요청합니다. f # (afaik이 언어들이 "함께"사용될 수있는 경우)에 만족한다면, 나는 다음과 같은 단편을 제공 할 수 있습니다 (분리는 세미콜론이 아닙니다. 는하지만) 공간으로 빌 :

함수 yourLoop 인수 세 개의하는 int 얻어 '구체적 유형의 부작용 (a LOWERBOUND UPPERBOUND 및 기능 -)> 단위 : 본체 그런 의미로

yourLoop (lowerBound:int) upperBound body 

은 동일한 효과가

012 예

let rec yourLoop (lowerBound:int) upperBound body = 
    if (lowerBound >= upperBound) then body upperBound 
    else 
    body lowerBound 
    yourLoop (lowerBound+1) upperBound body 

이 일부에있어서의 본체하자

let something i = printfn "%s%i" "do something with " i 

다음

yourLoop 0 5 something 

수율

01,232을 적용한 다음과 같이 3,516,
for i in lowerBound..upperBound do 
    body(i) 

함수 보인다 대신 아래로 루프 톱에 원하는 경우

마찬가지로, 당신은,보다 일반적인 함수의

yourInvertedLoop 0 5 something 

do something with 5 
do something with 4 
do something with 3 
do something with 2 
do something with 1 
do something with 0 

를 산출

let rec yourInvertedLoop lowerBound upperBound body = 
    if (lowerBound >= upperBound) then body lowerBound 
    else 
    body upperBound 
    yourInvertedLoop (lowerBound) (upperBound-1) body 

쓰기 고려할 수

let rec yourLoopIncr lowerBound upperBound next body = 
    if (next lowerBound >= upperBound) then body lowerBound 
    else 
    body lowerBound 
    yourLoopIncr (next lowerBound) upperBound next body 

어디를 루프가 반복하는 방법을 지정할 수 있습니다. 예를 들어,

yourLoopIncr 1 25 (fun x-> 2*x) something 

do something with 1 
do something with 2 
do something with 4 
do something with 8 
do something with 16 

비를 생성합니다 :이 솔루션은 값을 반환하지 않는 기관에 대해 작동합니다. 물론 콘솔에 물건을 쓰거나 변수 등을 변경할 수 있습니다. 예를 들어 것이다 당신은 새로운 DSL (도메인 특정 언어)을 만들 찾고있는 값 (55)

0

입력을 세미콜론으로 구분하여 받아 들일 수 있도록하려면 입력을 세미콜론으로 구분 된 하나의 문자열로 결합하십시오. 이것이 당신에게 이해가된다면, 배열의 모든 입력을 가지고 배열에 .join(';')을하십시오. 세미콜론이 특정 요구 사항이 아니라면 배열 자체를 전달하십시오.

관련 문제