Killer semi-unique 프로그래밍 언어 기능 [닫기]


25

새로운 프로그래밍 언어를 배울 때 때때로 당신이 알고있는 다른 프로그래밍 언어로 언어를 갖고 싶어하는 언어 기능을 보게됩니다.

당신에게 새로운 것을 배우고 다른 프로그래밍 언어를 원했던 언어 특징은 무엇입니까?

이에 대한 예는 Python 또는 C #의 생성기 입니다. 다른 예로는 Python의 목록 이해, .NET의 C ++ 또는 LINQ 템플릿 또는 Haskell의 게으른 평가가 있습니다.

완전히 새롭고 계몽 된 다른 반독점 언어 기능은 무엇입니까? 독창적이고 유행을 벗어난 이전 프로그래밍 언어의 다른 기능이 있습니까?

답변:


25

하스켈에서 실제로 무엇이든

  • 모나드. 예-파서, IO, 목록 작업 및 기타 작업을 매우 쉽게 만드는 큰 무서운 단어 (한 번 일반적인 패턴을 발견하면)
  • 화살표. 고급 사용자도 마찬가지입니다.)
  • 람다 등과 같은 표준 물건
  • 카레 기능
  • 대수 데이터 타입
  • 패턴 매칭

그리고 더 많은.

추신. 예. 누군가 물어 본다면 하스켈 팬보이입니다.


12
공정하게하려면, 그 목록의 대부분에 대해 ML 크레딧을 제공해야합니다.
munificent

1
글쎄-모나드와 화살표 IIRC를 제외하고. 그러나 그들은 여전히 - 독특한를
마치에이 Piechotka

downvote에 대한 특별한 이유가 있습니까?
Maciej Piechotka

2
패턴 일치의 경우 +1 나는 다른 사람들에게 그것을 보여 주지만 그들은 얻지 못한다. 나는 그것이 천재라고 생각합니다.
Barry Brown

의무 사항 ( steve-yegge.blogspot.com/2010/12/… ). BTW, 람다를 독특하고 파이썬, C #, 자바 스크립트 등으로 생각하지는 않습니다. Monads? 대부분의 다른 언어는이를 체인으로 지칭합니다. jquery 코어는 본질적으로 HTML / DOM 및 AJAX 모나드 (Google : jQuery.fn) 중 하나입니다. 요즘 카레도 비교적 일반적입니다.
Evan Plaice

21

리스프 매크로.

Lisp 매크로 언어는 편의상 몇 가지 사전 정의 된 구문 기능이있는 Lisp입니다. 그것들을 사용하면, 객체 지향 스타일의 선택 또는 프롤로그와 같은 결정 론적 일치와 같은 주요 기능을 제자리에 추가하지 않고도 언어에 추가 할 수 있습니다. 그것은 setf매크로를 가능 하게합니다. 이것은 개념적으로 매우 강력한 매크로입니다. (setf A B)즉, 평가할 때을 A얻을 B수 있으며 원하는 제한까지 확장 할 수 있습니다.

C ++ 템플릿 메타 프로그래밍은 비슷한 기능을 수행 할 수 있지만 일반 C ++과는 다른 언어로 제공됩니다.


+1 언젠가 Lisp 방언으로 프로그램 할 수 있기를 바랍니다.
Oliver Weiler

@Helper ... C ++ 템플릿을 통해 [무서운 웃음]
mlvljr

@ mlvjr : 당신은 무섭다.
David Thornley

실제로, 그것은 언어에서 필요한 유일한 기본 기능입니다. Lisp 매크로를 사용하면 나중에 다른 모든 가능한 기능을 추가 할 수 있습니다.
SK-logic

18

파이썬의 데코레이터.

데코레이터를 사용하여 메모 또는 기능 타이밍을 구현하는 것이 매우 쉽습니다.

기능 타이머의 예.

class FuncTimer(object):
    """ Time how much time a function takes """
    def __init__(self, fn):
        self.fn = fn
        self.memo = {}
        self.start_time = time.time()
    def __call__(self, *args):
        self.memo['return'] = self.fn(*args)
        print("Function '%s' took %u seconds" % (self.fn.__name__, time.time() - self.start_time))
        return self.memo['return']

시간을 내고 싶은 foo 함수가 있다면 간단히 할 수 있습니다.

@FuncTimer
def foo():
    # foo's implememtation goes here

다음과 같은 것을 보게 될 것입니다.

함수 'foo'는 3 초가 걸렸습니다.


자바는 주석과 비슷한 목적과 구문을 가지고 있지만 매우 다르게 작동한다
Casebash

1
+1 : 파이썬의 데코레이터는이 언어의 다른 어떤 기능보다도 인상적이었습니다. 그들은 매우 아름답고 간단합니다!
Adam Paynter

어쩌면 당신은 우리와 간단한 예를 공유 할 수 있습니까? 나는 파이썬이 정직하다는 것을 모른다.
ShdNx

@ ShdNx, 방금 예를 추가했습니다.
grokus

1
시작 시간을 호출의 일부로 계산해서는 안됩니까?
detly

14

에 캐스팅 void*C. 당신의 것은 원시 바이트로 모든 것을 던져, 그리고 할 수있는 당신이 원하는대로 이러한 데이터와 함께.

(예, 요즘 은의 독특한 ...)


1
.Net 언어의 객체는 매우 유사합니다. 더 안전하고 안전한 타입
Maciej Piechotka

많은 언어로 객체에 캐스트 할 수 있습니다. 주요 문제는 많은 언어들이 프리미티브와 객체를 분리한다는 것입니다.
Casebash

5
@Maciej : .NET에서도 프리미티브를 Object로 캐스트 할 수 없습니다. 당신은 그것들을 상자에 넣었고, 그것은 상당히 다른 짐승입니다. 게다가, 그것은 여전히 ​​캐스팅과 완전히 다릅니다 void*.
Dean Harding

1
PointerPascal과 Object Pascal에서 캐스트하는 것은 같은 일을합니다.
Frank Shearar

1
@DeanHarding : 글쎄-C int64_t에서는 항상 안전하게 캐스팅 할 수없는 void *(2 년 후반에 죄송합니다-답장).
Maciej Piechotka

12

파이썬의 수확량

파이썬 (그리고 C #을 믿는다)에서는 yield명령문 에서 함수 실행을 일시 중지 하고 값을 반환하고 후속 호출에서 중단 된 곳에서 함수를 다시 시작하는 호출기를 생성 할 수 있습니다 (통화 사이에 상태가 유지됨). 함수의 현재 값에만 관심이있는 긴 값 목록을 생성하는 데 유용합니다 (매우 일반적 임). 메모리에서 매우 제한된 공간 만 차지하면서 무한히 긴 시퀀스를 만들 수 있습니다.


1
수율은 이미 질문에 나열되어 있습니다.
트리니다드

이것은 BCPL로 거슬러 올라갑니다.
피터 테일러

8

Lambda 표현식 (클로저, 중첩 함수, 익명 메소드, 호출하는 모든 것)

나는 펄에서 처음으로 그들을 만났고, 즉시 그들을 사랑했고 왜 다른 언어에 없는지 궁금했습니다. 요즘 나는 더 이상 그렇게 독특하지 않다고 생각합니다. PHP조차도 어떻게 든 그들을 해킹했습니다. 그러나 당시에는 반 독특했습니다.


5
두 번째로 오래된 프로그래밍 언어 인 Lisp로 돌아가는 한 독특합니다. ;-)
Michael H.

-1 : 반 고유하지 않음
Casebash


7

델파이의 세트는 명명 된 부울 배열과 같은 매우 유용합니다. 32 개의 확인란이있는 설정 양식을 저장하는 데 매우 유용합니다. 그러나 그들은 모두 같은 이론적 기능을 가지고있다 (즉, 차이, 교차, 결합).

그들이 유행에서 떨어졌는지 확실하지 않지만, 나는 그것들을 항상 사용합니다.


훌륭하지만 Java에서는 구현하기 쉽지 않습니다 (예 : boolean []?
Mark C

네, 가능하지만, 간결하다고 생각하지는 않습니다 : TForm = (FF_1500 = 1, FF_CA251 = 5, FF_UB04 = 6, FF_MA10 = 7); TFormSet = TForm 세트;
피터 터너

7

보내다

Erlang에서. 다른 스레드에 비동기 적 으로 메시지를 보냅니다 .

Expr1 ! Expr2

받다

Erlang에서. 다른 스레드로부터 메시지를받습니다.

receive
    Pattern1 [when GuardSeq1] ->
        Body1;
    ...;
    PatternN [when GuardSeqN] ->
        BodyN
end

5

C # 속성

/// <summary>
/// Get ID
/// </summary>
public int ID
{
    get; set;
}

vs

(자바)

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

2
예, 더 낫지 만 이것은 나쁜 예입니다. getter / setter가 실제로 특별한 작업을 수행하고 C # 버전이 덜 문서화되어 있으면 차이가 훨씬 작아집니다.
바트 반 Heukelom

1
내 상사는 C #의 자동 속성에 강력하게 반대하며 우리가 그것에 대해 논쟁을 할 때마다 다른 사람이 왜 옳고 그른지 알 수 없습니다. 나는 그들이 코드를 너무 깨끗하게하고 장기적으로 많은 시간을 절약하기 때문에 그것들을 좋아합니다.
mbillard

2
사람들이 게터와 세터를 온몸에 갖도록 장려하지 마십시오. 객체의 동작으로 이해되는 게터와 세터 만 사용해야합니다.
David Thornley

3
그들은이 자동 속성이라고하고, C #을 속성이라고하지 않을
자코 프리 토 리우스

1
자동 속성은 요즘 매우 일반적입니다. Python, Objective-C ...
Casebash

5

C의 조합

솔직히 말해서 C를 작성하지 않아서 직접 만들 수는 없지만 다른 코드로 작업했습니다.

네트워킹 또는 이진 데이터 저장소와 같은 원시 비트 / 바이트를 조작하는 응용 프로그램에서 서로 다른 데이터의 혼합을 패키징 할 때. 강력하게 입력 된 언어에서는 이에 상응하는 쉬운 방법이 없습니다.

기권:

유니온은 경우에 따라 매우 유용하지만 유형이 안전하지 않기 때문에 대부분의 고급 언어에서는 찾을 수 없습니다. IE에서는 공용체를 사용하여 변수 경계에서 데이터를 번갈아 만들 수 있습니다 (유형 안전 세계에서는 그렇지 않습니다). 큰 힘에는 큰 책임이 따른다.


2
좋은 이유가 있습니다. 데이터를 재 해석하는 것은 걸어서 직접 촬영하는 아름다운 방법입니다 ( en.wikipedia.org/wiki/Aliasing_(computing) ). 명시 적 변환 IMHO를 더 잘 사용하십시오. 올바른 방식으로 일하는 노동 조합은 IMHO 대수적 데이터 유형입니다.
Maciej Piechotka

@Maciej 필요한 면책 조항을 추가했습니다. 그러나 실제로 노동 조합 사용에 대한 친밀한 지식이 없기 때문에 노동 조합 사용의 위험을 정확하게 설명하는지 확실하지 않습니다. 나는 그들이 코드를 사용하는 것을 보았던 곳에서 고급 언어보다 훨씬 간결하고 작업하기 쉽다는 것을 알고 있습니다.
Evan Plaice

문제는 C가 '상위 레벨 언어'(저수준 상위 레벨 언어)라는 것입니다. K & R C 이후로 더 빠른 휴대용 코드를 사용할 수있는 규칙이 많이 있습니다. 가격은 컴파일러가 다양한 것을 가정하고 일부는 혼란 스러울 수 있다는 것입니다. 의 가장 union참조 - 사용은 일부 잘 (기술적으로 정확하지는 않지만) 숙어 지원, 안전 cellperformance.beyond3d.com/articles/2006/06/...를 (이 포인터 조합과 더 poblem 수 잘 가짜가 있지만).
Maciej Piechotka

델파이 record는 노동 조합을 지원하기 위해 구문을 확장했다 :in_addr = record case integer of 0: (S_un_b: SunB); 1: (S_un_w: SunW); 2: (S_addr: u_long); end;
Frank Shearar

5

내가 정말 좋아 하지 않는 한 에서 수정 루비 . 너무 자연스럽고 코드가 없으면 코드가 매우 지저분한 것처럼 보이는 많은 시나리오를 대체합니다.

puts "All good" unless input.nil?

당신은 어떻게 그것을 좋아하지 않을 수 있습니까? :디


6
펄은 루비보다 먼저 가지고있었습니다. 나도 그거 사랑해.
Barry Brown

1
Nemerle은 전통적으로 사용되는 가장 일반적인 분기 시나리오에 대해 유사한 키워드를 가지고 unless있으며 when이를 대체합니다 if/else.
MattDavey

5

멋진 파이썬 인수 구문

나는 이것이 얼마나 독창적인지 확실하지 않지만 파이썬에서는 키워드 쌍을 자동으로 사전으로 만들고 다시 만드는 것과 같은 멋진 일을 할 수 있습니다. 목록과 동일 :

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    print "-- This parrot wouldn't", action,
    print "if you put", voltage, "volts through it."
    print "-- Lovely plumage, the", type
    print "-- It's", state, "!"


parrot(1000)
parrot(action = 'VOOOOOM', voltage = 1000000)
parrot('a thousand', state = 'pushing up the daisies')
parrot('a million', 'bereft of life', 'jump')

python docs (더 많은 논쟁 파싱을 위해 아래로 스크롤하십시오)


1
+1 모든 선택적 매개 변수에 대한 값을 전달 하지 않고 목록에서 깊이있는 매개 변수를 전달할 수있는 경우 +1
eswald

4

C 전 처리기 ifdef를 사용하여 다른 플랫폼에 공통 코드를 작성할 수도 있습니다.


2
추가 단계를 거치고 모든 언어로 작업 할 수있는 더 나은 전처리 기가 있습니다.
David Thornley

ifdef, ifndef 및 기타에 매우 만족합니다.
ern0

3

오브젝티브 -C 카테고리

카테고리는 런타임에 객체의 기능을 쉽게 확장 할 수있는 방법을 제공합니다 (구성과 상속 비교). 전형적인 예는 맞춤법 검사기를 NSString 클래스에 추가하는 것입니다.

@interface NSString (SpellChecker)
- (BOOL) checkSpelling;
@end

카테고리의 메소드 구현은 상위 구현을 대체하므로 영향이 적은 버그 수정에도 유용합니다.


1
C #의 확장 방법과 매우 유사
Casebash

2

Ruby 1.9 의 Symbol # to_proc 기능 과 결합 된 Ruby주입 방법을 사용하면 매우 간결하지만 읽을 수있는 코드를 작성할 수 있습니다.

예 : (1..10).inject(:+)

정수 1에서 10까지의 합 => 55

이와 같은 예제를보고 방금 시작한 Ruby를 배우고 싶었습니다.


9
공정하게 말하자면 Lisp, Haskell 등의 언어에서 Ruby의 fold / foldl / foldr 버전을 주입하십시오.
mipadi

나는 이것을 이것을 독특한 것으로 부르지 않을 것이다.
Daenyth

1
질문의 제목은 "세미 독특하다"고 독특하지 않습니다. 주입 (또는 맵 등)과 Symbol # to_proc의 조합으로 제공되는 코드의 간결함은 C, Java 및 C ++와 같은 주류 언어를 넘어서는 것입니다.
tcrosley

매우 간결하지만 (그리고 마음에 들지만) 다음과 다른 점이 확실하지 않습니다. Enumerable.Range (1, 10) .Aggregate ((s, x) => s + x); C # 또는 다른 언어에서
FinnNk

1

JavaFX (RIP) 의 바인딩 메커니즘 . 바인드 키워드는 식의 값에 변수의 값을 결합하고 모든 추한 리스너 무엇이든지 상용구 코드를 제거지고 있습니다.

JavaFX는 여러면에서 상당히 실패했지만 스크립팅 언어의 많은 기능이 상당히 훌륭하다는 것을 알았습니다.


1

D에서 문자열 믹스 인과 컴파일 타임 함수 평가는 매우 독특한 킬러 기능입니다. 예, 기술적으로는 두 가지 기능이지만 실제 기능은이 기능을 결합한 것입니다. 이 조합을 사용하면 컴파일 타임에 코드를 문자열로 생성하는 일반 D 함수를 작성한 다음이 코드를 임의의 범위에 혼합하여 일반 D 코드로 평가할 수 있습니다. 코드는 완전히 정적으로 컴파일되어 마치 손으로 쓴 것처럼 정확하게 실행됩니다. 이 기능은 표준 라이브러리에서 몇 가지 끈끈한 상황을 해결하는 데에도 사용됩니다.


또한 메소드에서 자동으로 추론 된 리턴 유형을 좋아합니다.
nawfal
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.