Bazı dillerdeki belgeler neden “olduğu” yerine “eşdeğeri” diyor?


23

Bazı dillerdeki belgeler neden "is" yerine "eşdeğer" diyor?

Örneğin, Python Belgeleri diyor ki

itertools.chain(*iterables)

...

Eşdeğer :

def chain(*iterables):
    # chain('ABC', 'DEF') --> A B C D E F
    for it in iterables:
        for element in it:
            yield element

Veya bu C ++ referans üzerinde find_if:

Bu işlev şablonunun davranışı şuna eşittir :

template<class InputIterator, class UnaryPredicate>
  InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred)
{
  while (first!=last) {
    if (pred(*first)) return first;
    ++first;
  }
  return last;
}

Gerçek kod bu değilse, gönderemezler mi? Ve eğer gerçek kod ise, neden basitçe "olduğunu" "Eşdeğer" olarak söylemeliler?


2
Ne için bkz geldiğini hatırlatırız find_ifolduğu değil C "" dokümantasyon ++. Öyle olsaydı, oyuncu kadrosu bool(aşağıdaki cevapta gördüğünüz gibi) yanlış olurdu.
Mehrdad

3
Python söz konusu olduğunda, kaynak kodunu ararsanız chain, doğrudan C olarak uygulandığını göreceksiniz , bu nedenle aynı sonucu ürettiği için, bu python koduna "eşdeğer" olur, ancak, bu yorumlama işleminin bir miktar ek yükünden kaçınır baytkodu.
Bakuriu,

@Mehrdad Resmi belgeler olmadığını biliyorum, sadece C ++ 'ın özelliklerini bulmada en çok yardım ettiğim kaynak
Jon McClung

Standartta belirlenen herhangi bir yaklaşımı kullanmak zorunda kalacaklardı, önemli ölçüde daha iyi bir yaklaşım olsa bile.
Kevin

Yanıtlar:


67

Çünkü standart yazarlar aslında bir uygulama öne sürmek istemiyorlar. Onlar ne tanımlamak istediğiniz yapar ama mutlaka bunu nasıl. Örneğin, GNU C ++ sürümünefind_if bakarsanız , uygulamanın verdiğinizden biraz farklı olduğunu göreceksiniz, bu C ++ standardına dayanmaktadır:

template<typename _InputIterator, typename _Predicate>
inline _InputIterator
__find_if(_InputIterator __first, _InputIterator __last,
    _Predicate __pred, input_iterator_tag)
{
    while (__first != __last && !bool(__pred(*__first)))
     ++__first;
       return __first;
}

Bu, işlevsel olarak standardın sahip olduğu değere eşittir, ancak tam olarak aynı değildir. Bu derleyici yazarlarına esneklik verir. Belirli bir platform için yapmanın daha iyi bir yolu olabilir. Uygulayıcı farklı bir kodlama stili kullanmak isteyebilir.

Bu, özellikle uygulayıcının performans nedenleriyle tamamen farklı bir dilde uygulamaya karar verebileceği python gibi betik dilleri için geçerlidir. Python uygulayan biri, örneğin, itertools.chain(*iterables)C ++ ile yazabilir . Kod, sağlanan python ile aynı olduğu sürece, standart "eşdeğer" diyorsa bu tamamen iyidir. Eğer standart "ise" ise, uygulayıcılardan o dilde uygulama yapmaları veya standarda uymamaları istenir.

Özetle:

  1. Çünkü bir uygulamanın, sağlanan standarttan daha iyi kod yazmasını önlemek istemiyorlar.
  2. Çünkü, bir uygulamanın tamamen farklı bir dil kullanmasını önlemek istemiyor, performansı artırmak için

Aydınlatıcı cevap için teşekkür ederim! Cevabın bu sınırlar boyunca bir şey olduğundan şüphelendim.
Jon McClung

@lerenard, find_if'in tam uygulamasını Steven'ın linkinden okumayı aydınlatıcı bulabilir. (Orada ne var gerçekten sadece bir kısmıdır.)
Winston Ewert

@WinstonEwert, Ne yazık ki tam olarak böyle bir kod anlama düzeyinde değilim, ancak alt çizgilerin liberal kullanımı kesinlikle bir ilgi çekici!
Jon McClung

9
@lerenard: Bu ek önde gelen alt çizgi, standart kütüphane içindekilerin yazabileceğiniz kodlara müdahale etmemesi için orada bulunur (çift önceli alt çizgi içeren isimler, derleyici / standart kütüphane yazarları tarafından kullanılmak üzere ayrılmıştır).
Bart van Ingen Schenau

5
Peki, C ve C ++ 'da her zaman bir as-if kural vardır, bu yüzden standart söylenenin yerine, söylense bile, gerçek uygulama farklı olabilir.
Deduplicator
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.