태그 보관물: language-design

language-design

왜 더 많은 언어가 한 개 이상의 다른 값과 값을 비교할 수있는 능력이 없습니까? [닫은]

다음을 고려하세요:

if(a == b or c)

대부분의 언어에서 다음과 같이 작성해야합니다.

if(a == b or a == c)

약간 번거롭고 정보를 반복합니다.

위의 샘플 구문이 약간 복잡하다는 것을 알고 있지만 아이디어를 전달하는 더 좋은 방법이 있다고 확신합니다.

더 많은 언어가 제공하지 않는 이유는 무엇입니까? 성능이나 구문 문제가 있습니까?



답변

구문 문제는 구문이 필요하다는 것입니다.

귀하의 언어가 어떤 구문을 가지고 있든지, 언어를 사용하는 사람들은 그 언어를 배워야합니다. 그렇지 않으면 코드를보고 코드의 기능을 모를 위험이 있습니다. 따라서 언어에 많은 경우를 깔끔하게 처리하는 간단한 구문이있는 경우 일반적으로 좋은 것으로 간주됩니다.

특정 예에서, 중위 연산자 (두 개의 인수를 사용하지만 작성된 함수)를 가져 와서 Argument1 Operator Argument2여러 인수로 확장하려고합니다. infix 연산자의 전체 요점은 연산자가 2 개의 인수 사이에 올바르게 놓여 있기 때문에 매우 깨끗하게 작동하지 않습니다. 로 확장 (Argument1 Operator Argument2 MagicallyClearSymbol Argument3...)해도에 많은 명확성이 추가되지 않는 것 같습니다 Equals(Arg1,Arg2,...). Infix는 일반적으로 사람들이 잘 알고있는 수학적 규약을 에뮬레이션하는 데 사용되는데, 이는 대체 구문에는 해당되지 않습니다.

파서는 구문 분석 속도에 약간의 영향을 줄 수있는 다른 생산 규칙 또는 2 개의 문법을 처리해야한다는 것 외에는 아이디어와 관련된 특정 성능 문제가 없습니다. 이는 해석되거나 JIT 컴파일 된 언어에 약간의 차이를 만들 수 있지만 큰 차이는 없습니다.

이 아이디어의 더 큰 문제 는 언어에서 특별한 경우많이 만드는 것이 나쁜 아이디어 인 경향이 있다는 입니다.


답변

문제가 아니기 때문에 해결하면 기본적으로 이점이 없지만 구현하면 비용이 들지 않습니다.

기존의 범위 기반 기능과 실제로 모든 언어가 제공하는 기능 a == b || a == c은 자르지 않는 크기로 확장되는 경우이 상황에서 완벽하게 작동 할 수 있습니다 .


답변

일부 언어에는 그러한 기능이 있습니다. 예를 들어 Perl6에서는 Junctions 를 사용할 수 있습니다. Junctions 는 두 값의 “중첩”입니다.

if $a == any($b, $c) {
    say "yes";
}

# syntactic sugar for the above
if $a == $b | $c {
    say "yes";
}

정션을 사용하면 스칼라 연산이 일부 언어의 컬렉션에 분산되는 방식과 유사하게 데이터 집합에 대한 연산을 매우 간결하게 표현할 수 있습니다. 예를 들어 Python을 numpy와 함께 사용하면 비교가 모든 값에 분산 될 수 있습니다.

import numpy as np
2 == np.array([1, 2, 3])
#=> np.array([False, True, False], dtype=np.bool)
(2 == np.array([1, 2, 3])).any()
#=> True

그러나 이것은 선택된 기본 유형에 대해서만 작동합니다.

접합부가 왜 문제가됩니까? 정션에 대한 작업은 포함 된 값으로 분산되므로 정션 오브젝트 자체는 메소드 호출을위한 프록시처럼 작동합니다. 오리 입력 외에는 몇 가지 유형 시스템 만 처리 할 수 ​​있습니다.

이러한 정션이 비교 연산자 주위의 특수 구문 으로 만 허용되면 유형 시스템 문제를 피할 수 있습니다 . 그러나이 경우에는 너무 제한되어 있으므로 제정신의 언어에 추가 될만큼 충분한 가치를 추가하지 못합니다. 동일한 동작이 set 연산을 사용하여 표현되거나 모든 비교를 수동으로 철자 할 수 있으며, 이미 완벽하게 훌륭한 솔루션이있는 경우 대부분의 언어는 중복 구문 추가를 믿지 않습니다.


답변

매크로가있는 언어의 경우 아직없는 경우 쉽게 추가 할 수 있습니다. 라켓 고려

(define-syntax-rule (equal-any? a b ...)
  (or (equal? a b) ...))
(equal-any? "a" "b" "a")
> #t

메타 프로그래밍이없는 다른 언어에서는 아마도 집합 / 목록 멤버쉽 검사로이를 재구성 할 수 있습니다.

if a ∈ {b, c}


답변

일부 (인기있는) 언어에서 ==연산자는 전 이적이지 않습니다. 자바 스크립트의 예를 들어 0모두 동일 ''하고 '0'다음 만 ''하고 '0'서로 동일하지 않습니다. PHP에서 그러한 단점이 더 많습니다.

그것은 그것이 의미하는 a == b == c그것으로 해석인지에 따라 다른 결과를 얻을 수 있기 때문에, 다른 모호성을 추가 (a == b) & (a == c)하거나 (a == b) & (a == c) & (b == c).


답변

대부분의 언어에서, In함수 를 작성함으로써 사소한 것을 달성 할 수 있어야하는데 왜 실제 언어의 일부로 만드는가?

예를 들어 Linq는 Contains()입니다.

자, 모든 여러분을 위해 C #에서 구현 한 것이 있습니다.

public static bool In<T>(this T obj, params T[] values)
{
    for(int i=0; i < values.Length; i++)
    {
        if (object.Equals(obj, values[i]))
            return true;
    }
    return false;
}


답변

“if (a == b 또는 c)”는 대부분의 언어에서 작동합니다. a == b 인 경우 또는 c가 음수, 널 또는 0이 아닌 경우.

그것이 장황하다는 불만은 요점을 놓치고 있습니다. 조건부로 12 가지 물건을 쌓아서는 안됩니다. 하나의 값을 임의의 수의 다른 값과 비교해야하는 경우 서브 루틴을 빌드하십시오.