가드(컴퓨터 과학)
Guard (computer science)![]() |
컴퓨터 프로그래밍에서 가드는 프로그램 실행을 해당 분기에서 계속하려면 true로 평가해야 하는 부울식이다.
어떤 프로그래밍 언어를 사용하든 가드 조항, 가드 코드 또는 가드 문장은 실행 중 오류를 방지하기 위해 사용되는 무결성 전제 조건의 점검이다.처리하려는 참조가 null이 아니므로 null-pointinter 오류가 발생하지 않는지 확인하는 것이 일반적인 예다.다른 용도에는 처분 패턴과 같이 부울 필드를 공차(따라서 후속 호출이 nops)로 사용하는 것이 포함된다.가드는 서브루틴에서 조기 출구를 제공하며, 구조화된 프로그래밍에서 흔히 사용되는 편차로, 한 수준의 내포를 제거하고 평탄한 코드:[1] 교체.if guard { ... }
와 함께if not guard: return; ...
.
이 용어는 버전 3.10의 APL, Haskell, Clean, Erlang, ucam, Promela, OCaml, Swift,[2] Python, Scala 프로그래밍 언어에서 특정한 의미로 사용된다.[citation needed]매스매티카에서는 경비원을 제약이라고 부른다.가드는 형식적인 방법의 언어인 Guarded Command Language의 기본 개념이다.가드는 구조물이 일치하더라도 패턴을 건너뛸 수 있는 가능성과 함께 패턴 매칭을 증가시키는 데 사용할 수 있다.조건문에서의 부울 표현은 조건이라고 불리지만 일반적으로 가드의 이 정의에도 적합하다.
다음 Haskell 예에서 가드는 "와 "="의 각 쌍 사이에 발생한다.
f x x > 0 = 1 그렇지 않으면 = 0
이는 각 수학 표기법과 유사하다.
이 경우 경비원은 "만약"과 "그렇지 않으면" 조항에 있다.
위의 예와 같이 병렬 가드가 여러 개 있을 경우 일반적으로 상하 순서에 따라 시도하며, 가장 먼저 통과할 지점을 선택한다.케이스 리스트에 있는 경비원들은 전형적으로 평행하다.
그러나 하스켈 목록에는 경비병들이 직렬로 배치되어 있으며, 이들 중 하나라도 실패하면 목록 요소가 생성되지 않는다.이것은 별도의 가드를 논리적 AND와 결합하는 것과 같을 것이다. 다만 가드들 사이에 다른 목록 이해 조항이 있을 수 있다는 점을 제외하면 말이다.
진화
1963년 이미 CPL에 존재하는 간단한 조건부 표현은 첫 번째 하위 표현에 대한 가드, 그리고 첫 번째 표현은 사용할 수 없는 경우에 사용할 다른 하위 표현에 대한 가드를 가지고 있다.이를 작성하는 몇 가지 일반적인 방법:
(x>0) -> 1/x; 0 x>0 ? 1/x : 0
만약 두 번째 하위 표현이 더 단순한 조건부 표현이 될 수 있다면, 우리는 더 많은 대안을 제시하여 마지막 가을철에 앞서 시도해 볼 수 있다.
(x) -> 1/x; (x<0) -1/x; 0
1966년 ISWIM은 의무적인 낙하산 케이스가 없는 조건부 표현 형식을 가지고 있어 가드 개념과 가드(Guard)를 둘 중 하나를 선택하는 개념으로 분리했다.ISWIM의 경우 대안이 하나도 사용되지 않을 경우 값을 정의하지 않는 것으로, 이 값은 절대 값으로 계산하지 않도록 정의되었다.
SASL(1976년)의 '미니포화 버전'[3]인 KRC는 '가드'라는 용어를 사용한 최초의 프로그래밍 언어 중 하나였다.그 기능 정의는 여러 절이 있을 수 있으며, 적용할 것은 각 절에 따르는 가드를 기준으로 선택되었다.
면 n = 1, n = 0 = n * 면 (n-1), n > 0
경계조항의 사용과 "보호조항"이라는 용어는 적어도 켄트 벡이 성문화한 1990년대의 스몰토크 관습에 기인한다.[1]
1996년, Dynalog APL은 가드가 유일한 제어 구조인 대체 순기능 방식을 채택했다.[4]이 예제는 APL에서 입력 번호의 패리티를 계산한다.
동등성←{ 2∣⍵ : 'odd' '짝짝짝' }
패턴 가드
패턴 가드는 패턴에 부착된 가드 외에 패턴 가드의 맥락에서 패턴 매칭의 사용을 참조할 수 있다.사실상 패스를 의미하는 패턴의 일치가 취해진다.이러한 의미는 1997년 4월 사이먼 페이튼 존스의 하스켈에 대한 제안서 '새로운 근위병 관점'에서 소개되어 제안서의 이행에 사용되었다.이 기능은 패턴의 가드 안에서 패턴을 사용할 수 있는 기능을 제공한다.
확장 Haskell의 예:
투박한 부러워하다 var1 var2 그냥 val1 <- 찾다 부러워하다 var1 , 그냥 val2 <- 찾다 부러워하다 var2 = val1 + val2 -... 다른 건방진 방정식들...
이것은 다음과 같이 읽힐 것이다: "환경과 두 변수의 경우, 환경으로부터 변수들의 룩업이 값을 산출하는 경우, 그 값의 합이다." 목록 포괄에서와 같이, 경비원은 직렬로 배치되어 있고, 그 중 하나라도 실패하면 분기를 취하지 않는다.
예
공중의 끈을 매다 푸(끈을 매다 사용자 이름) { 만일 (사용자 이름 == 무효의) { 던지다 새로운 인수NullException(의 이름(사용자 이름), "사용자 이름은 null입니다."); } // 나머지 메서드 코드는 다음과 같다. }
참고 항목
참조
- ^ a b Beck, Kent (1997). "Guard Clause". Smalltalk Best Practice Patterns,. pp. 178–179.
- ^ Cook, Nate. "guard & defer". NSHipster. Retrieved 2016-02-26.
- ^ Turner, D. A. "Some History of Functional Programming Languages" (PDF).
- ^ Scholes, John. "Direct Functions in Dyalog APL" (PDF).