web-dev-qa-db-ja.com

言語構文について書いています。メソッド名の中にパラメーターが配置されている言語はありますか?

javaScript:

function getTopCustomersOfTheYear(howManyCustomers, whichYear) {
   // Some code here.
}
getTopCustomersOfTheYear(50, 2010);

c#の場合:

public List<Customer> GetTopCustomersOfTheYear(int howManyCustomers, 
 int whichYear)
{
   // Some code here
}
List<Customer> customers = GetTopCustomersOfTheYear(50, 2010);

pHPの場合:

public function getTopCustomersOfTheYear($howManyCustomers, $whichYear)
{
   // Some code here
}
$customers = getTopCustomersOfTheYear(50, 2010);

この構文をサポートする言語はありますか?

function GetTop(x)CustomersOfTheYear(y)
{
    // Some code here
}
returnValue = GetTop(50)CustomersOfTheYear(2010);

関数を書くより意味的で読みやすい形式ではないですか?

pdate:この質問をするのは、新しい言語の新しい構文に関する記事を書いているためです。ただし、メソッドの宣言にこのような構文を使用すると、開発者にとってより親しみやすくなり、自然言語により近いため、言語の学習曲線が減少すると考えました。この機能がすでに検討されているかどうかを知りたかっただけです。

29
Saeed Neamati

はい、そうです。はい、そのような言語があり、多くの人は慣れればもっと読みやすくなります。

Objective-Cでは、メソッドは次のようになります。

- (NSArray*)getTop:(int)count customersOfTheYear:(Year)year;

これは実際にはよく読めないかなり不自然な例なので、実際のコードからより良い例を以下に示します。

+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;

赤、緑、青、アルファの値を使用して新しいUIColorインスタンスを返すメソッドのプロトタイプ。次のように呼び出します。

UIColor *Violet = [UIColor colorWithRed:0.8 green:0.0 blue:0.7 alpha:1.0];

The Objective-C Programming Language で、パラメーターが散在したメッセージ名の詳細をご覧ください。

41
Caleb

回答:Smalltalk

http://en.wikipedia.org/wiki/Smalltalk

_'hello world' indexOf: $o startingAt: 6_はJavaの"hello world".indexOfStartingAt(o, 6)に似ています

_Rectangle width: 100 height: 200_はJavaのnew Rectangle(100, 200)に似ています

構文は... _expression Word1: parm1 Word2: parm2 Word3: parm3 ..._呼び出されるメソッドの名前は、すべての単語を連結したものです。

25
Jeff Grigg

流暢なインターフェースと呼ばれる抽象化を探していると思います(元々@Jesperによって作成されたコメントをここにあげています) 、「答え」へ)。」この現在一般的なパターンは、Objective-Cが1つだけである多くの言語で正常に実装されています。

これはかなりきれいな例です:

Person bo = new Person();
bo.Set.FirstName("Bo").LastName("Peep").Age(16).Size("Little").LostHerSheep();

Randy Patterson流暢なインターフェイスを設計する方法 で、このようなものを実装する方法を確認できます。

Andre Viannaが簡潔な history を提供し、さらに多くの有用な情報を含む2つの記事のパートで可能な実装について説明します。 Viannaは、最初に Smalltalk 8 で " cascading "と呼ばれていた同じアイデアに複数のメッセージを送信できるようにした古いアイデアを指摘します。それはこのように見えました:

aThing one: 'one';
  two: 'two';
  other.

その後、カスケードは「 メソッドチェーン 」に進化し、「 修飾子​​メソッドにHostオブジェクトを返すようにして、複数の修飾子を単一の式で呼び出すことができるようにします。 メソッドの連鎖 流暢なインターフェース のコンセプトになるまでに成長し、今日私たちが知っていて頻繁に使用しています。あなたがやろうとしていることはよく似ています。

Ayende Rahien は、 "fluent interface"が "method chaining"とは大幅に異なり、独自の名前に値する可能性がある)方法について説明します

流暢なインターフェイスは、 動作駆動型開発(BDD) で使用されるいくつかの新しいツールで一般的に見られ、主要な.NETユニットテストツールである NUnit への道を発見しました。新しい 制約ベースのアサートモデル

これらの基本的なアプローチは、Ruby、Python、C#、Objective-C、および Java などの他の言語で実装されました。似たようなものを実装するには、「 closure 」という考え方を検討する必要があります。これは、連鎖と流暢さの基本です。

おそらく、これらのモデルを改善できます。それが私たちが素晴らしい新しい言語を得る方法です。それでも、メソッドチェーンと流暢なインターフェイスを完全に理解することで、アイデアを進化させるための優れた出発点が得られると思います。

17
John Tobler

Objective-Cはそれを行います。ここに典型的なプロトタイプがあります:

- (void) areaWithHeight: (float) height andWidth: (float) width;

このようなメソッドを呼び出す方法は次のとおりです。

float area = [self areaWithHeight: 75 andWidth: 20];

Objective-Cは、主にCocoa for Mac OS XおよびCocoa Touch for iOSで使用されますが、gccは、gccが動作するほぼすべてのプラットフォームでObjective-Cコードをビルドします。

16
Mike Crawford

Common LISPでは、次のような関数のキーワード引数を定義できます。

(defun area (&key width height)
    (* width height))

関数は次のように呼び出されます:

(area :width 2 :height 3)

Adaでは、特別な宣言は必要ありません。引数を順番にリストするか、次のように引数に名前を付けることで、任意のプロシージャまたは関数を呼び出すことができます。

a := area(width => 2, height => 3);

最後に、ブーストライブラリには、機能をC++に追加するためのハックのレイヤーが含まれています。 http://www.boost.org/doc/libs/release/libs/parameter/doc/html/index.html =

13
han

名前を見つけることはできませんでしたが、同様のことを実行するためのデザインパターンがあり、関数呼び出しが、説明どおりに変更された新しいオブジェクトを返します。例えば:

query = db.getTopCustomers(50).forYear(2010);

内部で管理できないほどの複雑さを回避するためにデータは非常に直交している必要があるため、あまり使用されませんが、適切な状況では役立ちます。

5
Karl Bielefeldt

Pythonにはキーワードパラメータがあります。関数定義例

def getTopCustomers(count,year):
...

関数呼び出しの例

x = getTopCustomers(year=1990, count=50)

(私はこれが元の質問の精神に完全に含まれていないことを理解していますが、LISPのキーワードパラメータが適格である場合は、そうします。ただし、SmalltalkとObjective-Cでは、引数間のキーワードは実際には関数名/ルックアップの一部です。)

5
David Andersson

TeXでは、基本的に呼び出しプロトコルがフリーであることを意味する「引数パターン」を持つマクロを定義できます。あなたの具体的な例として、あなたは使うことができます

\def\getTopCustomers#1OfTheYear#2;{%
  The #1 top customers of the year #2.
}
\getTopCustomers 50 OfTheYear 2010;

レジスタを操作することに同意した場合は、;を取り除くこともできます。

\newcount\customers
\newcount\year
\def\getTopCustomers#1OfTheYear{%
  \customers#1\relax
  \afterassignment\reallyGetTopCustomersOfTheYear
  \year
}
\def\reallyGetTopCustomersOfTheYear{%
  The {\the\customers} top customers of the year {\the\year}.
}
\getTopCustomers 50 OfTheYear 2010

TeXを使用すると、レクサーを再構成できます。上記で使用した\afterassignmentマクロのおかげで、Lex番号に組み込みのプロシージャを使用できます。 非常に簡潔呼び出しプロトコルを定義すると非常に便利です。たとえば、テーブルのMarkdown表記を理解するTeXマクロを書くことは非常にもっともらしいことです。

次に、「顧客が保存されているデータベースにTeXからアクセスするにはどうすればよいですか?」しかし、これは別の質問です。 :)

Common LISPでは、これはqueryマクロを定義することで間違いなく可能であり、

(query getTopCustomers 50 OfTheYear 2010)

ここで、getCustomersとOfTheYearはシンボルとして解釈されます。次に、それを理解するのがマクロの仕事です。一般的なLISPは、マクロシステムによってアプリケーションに合わせて調整された疑似言語を簡単に作成できるため、コードの可読性の領域で優れています(つまり、そうですね!)。 (それらはアプリケーション言語と呼ばれていると思います。)

PS:誰もC++を引用していないようですあなたが得ることができる最も近い(プリプロセッサなしで)は

query.getTopCustomers(50).OfTheYear(2010):

トリックは、getTopCustomersqueryも実装するOfTheYear(またはその他)の参照を返すようにすることです。この例は小さなクエリ言語まで作成できますが、最終的なプロパティを特定する(値を返す)か、finaliseメソッドを追加する(ルックアップを実行して値を返す)必要があります。気に入った場合は、STLのストリームコントローラを模倣して、次のようなものを書くこともできます。

query << getTopCustomers(50) << OfTheYear(2010) << flush;

しかし、これは再びアプリケーション言語の方向に進んでいます。

編集:私は@hanの回答を見落としましたが、これもCommon LISPとC++を引用しています(ただしTeXではありません)。

プログラミング言語自体ではありませんがCucumberは関数名の途中でパラメーターを受け取ります。英語のように見えます。

「関数」はRubyで定義されていますが、

# definition
Given /^I calculate (.*) times (.*)$/ do |x, y|
    @result = x.to_i * y.to_i
end

Then /^the result should be (.*)$/ do |v|
    @result.should == v.to_i
end

# usage
Scenario:
    Given I calculate 6 times 9
    Then the result should be 42
4
configurator

Agdaにはmixfix表記があります

if_then_else x y z = case x of
                     True -> y
                     False -> z

 if cond then x else y

関数に下線が付いた名前が付けられている場合は常に、引数を間に挟んで2つの部分に分割できます。

4
Daniel Gratzer

JavaScriptまたはクロージャーをサポートするその他の言語では、次のような関数 curry を使用できます。

function getTopCustomersFunc(count) {
    return function(year) {
       // run some query, return count customers from year
    }
}
var top20Func = getTopCustomersFunc(20);
var top20Customers2005 = top20Func(2005);
var top20Customers2008 = top20Func(2008);
2
jiggy

これは「言語」の定義によって異なりますが、robotframeworkテストフレームワークでは、この方法でキーワードを定義できます。 埋め込み引数 に関するドキュメントから:

Select ${animal} from list | Open page | pet selection
                            | Select item from list | animal_list | ${amimal}

上記は、「select $ {animal} from list」という名前の新しいキーワード(基本的には関数)を宣言しています。ここで、「$ {animal}」はパラメーターです。 「リストから猫を選択」のように呼ぶ

1
Bryan Oakley

通知7。

To create (employee - a person) being paid (salary - a number):
    say "Welcome to your new job, [name of employee]!";
    choose a blank row from the table of employees;
    now the paid entry is the salary;
    now the name entry is the name of the employee.

等々。

1
Ron Newcomb

Common LISPのキーワードはすでに言及されていますが、Common LISPのマクロもこれをかなり簡単に許可します。

(defmacro get-my-element (from list at index)
  `(nth ,index ,list))

その後、次のように呼び出すことができます。

(get-my-element from '(a b c) at 1) ;returns B

ただし、fromおよびatという用語は強制されないことに注意してください。 somethingが存在する必要があり、それらを完全にスキップするとエラーになりますが、マクロが最終的にそれらを破棄するだけなので、読みやすさを超えているものは重要ではありません(これは重要です)。

(get-my-element from '(a b c) 3 1) ;also returns B
0
8bittree