ฉันกำลังเขียนเกี่ยวกับไวยากรณ์ภาษา มีภาษาใดบ้างที่มีพารามิเตอร์ใดวางอยู่ภายในชื่อเมธอด?


29

ใน 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);

รูปแบบการเขียนฟังก์ชั่นอ่านง่ายขึ้นหรือไม่

อัปเดต:สาเหตุที่ฉันถามคำถามนี้คือฉันกำลังเขียนบทความเกี่ยวกับไวยากรณ์ใหม่สำหรับภาษาใหม่ อย่างไรก็ตามฉันคิดว่าการมีไวยากรณ์ดังกล่าวสำหรับวิธีการประกาศอาจดีกว่าและเป็นมิตรกับนักพัฒนาและจะลดการเรียนรู้ของภาษาเนื่องจากการใกล้ชิดกับภาษาธรรมชาติมากขึ้น ฉันแค่อยากจะรู้ว่าคุณสมบัตินี้ได้รับการพิจารณาแล้วหรือไม่


12
มันอาจจะง่ายต่อการอ่านเมื่อคุณคุ้นเคยกับสำนวน แต่ดูเหมือนว่าสำหรับฉันมันคงยากที่จะเขียนโปรแกรมแยกวิเคราะห์ที่ถูกต้อง
Mason Wheeler

2
"ตัวแทน" หมายความว่าอย่างไร คำถามนี้ยากที่จะเข้าใจตามที่โพสต์ถึงแม้ว่าตัวอย่างรหัสสุดท้ายจะเตือนความทรงจำของ Objective-C และ SmallTalk
greyfade

3
AFAIK สมอลล์ทอล์คเป็นภาษาแรกที่ใช้รูปแบบนี้โดยเฉพาะเช่นหรือ'hello world' indexOf: $o startingAt: 6 Rectangle width: 100 height: 200Btw. เกิดอะไรขึ้นกับคำถามนี้
maaartinus

8
ถ้าคุณย้ายวงเล็บคุณจะได้รับ: returnValue = GetTop(50, CustomersOfTheYear(2010))ซึ่งฉันคิดว่าสามารถอ่านได้เท่า ๆ กันและมีความยืดหยุ่นมากกว่าเดิม / เป็นมุมฉาก ... และใช่มันเป็นไวยากรณ์ปกติธรรมดา
dagnelies

2
@arnaud: ฉันเห็นด้วยอย่างยิ่ง ไวยากรณ์ที่นำเสนอเป็นเพียงวิธีแก้ปัญหาสำหรับการขาดการสลายตัว
back2dos

คำตอบ:


41

ใช่และใช่ ใช่มีภาษาดังกล่าวและใช่หลายคนพบว่าสามารถอ่านได้มากขึ้นเมื่อพวกเขาคุ้นเคย

ใน 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];

อ่านข้อมูลเพิ่มเติมเกี่ยวกับชื่อข้อความด้วยพารามิเตอร์สลับในวัตถุประสงค์-C Programming Language


16
ครั้งแรกที่ฉันอ่านเกี่ยวกับเรื่องนี้ใน Objective CI คิดว่ามันฉลาด แต่จริงๆแล้วการตั้งชื่อพารามิเตอร์นั้นทำให้มีความแข็งและจัดการได้ยากขึ้น นอกจากนั้นคำตอบที่ดี
ZJR

2
ตัวอย่างของวิธีการที่เรียกใช้จะไม่ผิดพลาด
greyfade

3
@ZJR แม้จะมีความเห็นของ Wikipedia ในทางตรงกันข้ามสไตล์ของ Obj-C ก็เหมือนกับพารามิเตอร์ที่กำหนดชื่อ แต่ต่างกัน ในตัวอย่างข้างต้นวิธีการ+colorWithRed:blue:green:alpha:ชื่อ: ฉันเกิดขึ้นเพื่อใช้ชื่อสำหรับพารามิเตอร์ที่ตรงกับวิธีการ แต่ฉันจะได้ใช้อย่างง่ายดายr, b, และg aด้วยพารามิเตอร์ที่มีชื่อเช่นข้อเสนอ JavaScript คุณจะต้องใช้ชื่อจริงที่กำหนดเพื่อเข้าถึงค่า โดยปกติแล้วพารามิเตอร์ชื่อจริงสามารถกำหนดลำดับใดก็ได้และอาจเป็นพารามิเตอร์ก็ได้ คล้ายกันใช่ แต่แตกต่างกันโดยพื้นฐาน
คาเลบ

2
ฉันกำลังคิดหลาม: color(r=0xFF,g=0xFF,b=0x55)หรือcolor(b=0x32,r=0x7F,a=.5,g=0xFF)อื่น ๆ ลองเรียกพารามิเตอร์ที่มีชื่อมากๆ :)
ZJR

3
@ZJR ตัวอย่างไพ ธ อนของคุณถูกต้อง - นั่นคือสิ่งที่ฉันเรียกว่า "พารามิเตอร์ที่กำหนด" ฉันแค่บอกว่า Obj-C จริงๆไม่ได้ให้สิ่งนั้นเลย ไวยากรณ์ดูมากเช่นชื่อพารามิเตอร์ของ JavaScript เพราะวิธีการที่แตกออกเป็นชิ้นส่วนและแต่ละส่วนมีลำไส้ใหญ่ แต่ก็จริงๆไม่ได้ที่ทุก ชื่อใน Obj-C เป็นส่วนหนึ่งของชื่อเมธอดไม่ใช่ชื่อที่สามารถใช้เพื่ออ้างถึงพารามิเตอร์ในการอิมพลีเมนต์ เรื่องการสั่งซื้อ; พารามิเตอร์ไม่จำเป็น ฉันสงสัยว่าเราอาจเห็นด้วยมากกว่านั้น
คาเลบ

25

คำตอบ: smalltalk

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

'hello world' indexOf: $o startingAt: 6 ก็เหมือนของชวา "hello world".indexOfStartingAt(o, 6)

Rectangle width: 100 height: 200 ก็เหมือนของชวา new Rectangle(100, 200)

ไวยากรณ์คือ ... expression word1: parm1 word2: parm2 word3: parm3 ...ชื่อของวิธีการที่เรียกว่าคือการต่อกันของคำทั้งหมด


17

ฉันเชื่อว่าคุณกำลังมองหาสิ่งที่เป็นนามธรรมที่เรียกว่า " ส่วนต่อประสานที่คล่องแคล่ว (ตอนนี้ฉันขอเพิ่มความคิดเห็นซึ่งเดิมทำโดย @Jesper เป็น" คำตอบ ") รูปแบบทั่วไปนี้ได้รับการติดตั้งเรียบร้อยแล้วในหลายภาษาซึ่ง Objective-C เป็นเพียงภาษาเดียว

นี่คือตัวอย่างที่สะอาดสวย:

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

คุณสามารถดูวิธีการบางอย่างเช่นนี้สามารถดำเนินการในแรนดี้แพตเตอร์สัน 's วิธีการออกแบบอินเตอร์เฟซได้อย่างคล่องแคล่ว

Andre Vianna ให้ประวัติโดยย่อและจากนั้นจะอธิบายถึงการใช้งานที่เป็นไปได้ในอีกสองส่วนของบทความรวมถึงข้อมูลที่เป็นประโยชน์มากมาย Vianna ชี้ไปที่แนวคิดเก่าที่ฉันพบครั้งแรกในSmalltalk 80 ที่เรียกว่า " cascading " ซึ่งเปิดใช้งานการส่งข้อความหลายข้อความไปยังวัตถุเดียวกัน ดูเหมือนว่านี้:

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

การต่อเรียงกลายเป็น " วิธีการผูกมัด " ซึ่งเรา " ทำให้วิธีการปรับเปลี่ยนส่งคืนวัตถุโฮสต์เพื่อให้หลายตัวดัดแปลงสามารถเรียกใช้ในการแสดงออกเดียว. " วิธีการผูกมัดภายหลังเติบโตขึ้นเพื่อกลายเป็นแนวคิดส่วนต่อประสานที่เรารู้จักและใช้บ่อยวันนี้ . สิ่งที่คุณวางแผนจะทำมีลักษณะคล้ายกันมาก

Ayende Rahienกล่าวถึงวิธีการ"อินเตอร์เฟซได้อย่างคล่องแคล่ว" อาจแตกต่างกันอย่างมีนัยสำคัญเพียงพอจาก "วิธีการผูกมัด" ที่จะได้รับชื่อของตัวเอง

อินเตอร์เฟซได้อย่างคล่องแคล่วมักจะเห็นในบางส่วนของเครื่องมือใหม่ที่ใช้ในการพัฒนาพฤติกรรมการขับเคลื่อน (BDD)และได้พบแม้กระทั่งวิธีการของพวกเขาเป็นNUnitเป็นเครื่องมือทดสอบที่สำคัญหน่วย .NET ในใหม่จำกัด ยืนยันตามรุ่น

วิธีการพื้นฐานเหล่านี้ได้รับการดำเนินการต่อมาในภาษาอื่น ๆ รวมทั้งทับทิม, Python, C #, Objective-C และJava ในการดำเนินการบางอย่างที่คล้ายกันคุณจะต้องศึกษาแนวคิดของ " การปิด " ซึ่งเป็นพื้นฐานที่ดีมากสำหรับการผูกมัดและความคล่องแคล่ว

บางทีคุณสามารถปรับปรุงโมเดลเหล่านี้ได้ นั่นคือวิธีที่เราได้รับภาษาใหม่ที่ยอดเยี่ยม แต่ถึงกระนั้นฉันเชื่อว่าการเข้าใจวิธีการผูกมัดและอินเทอร์เฟซที่คล่องแคล่วจะทำให้คุณเป็นจุดเริ่มต้นที่ดีในการพัฒนาความคิดของคุณ!


2
+1 สำหรับคำตอบที่ถูกวิจัยมากที่สุดจนถึงตอนนี้การเพิ่มตัวอย่างและการอ้างอิงข้อความอีกครั้งสำหรับการอ่านอาจช่วยได้
haylem

@Haylem ขอขอบคุณที่ทำให้ฉันกลับไปเพิ่มตัวอย่างและรายละเอียดอีกเล็กน้อย!
John Tobler

3
โหวตขึ้นเพราะเป็นคำอธิบายที่ดีเกี่ยวกับสไตล์ความคล่องแคล่ว แต่โปรดทราบว่านี่ไม่ใช่สิ่งที่ OP ต้องการ เมื่อฉันอ่านคำถามนี้เกี่ยวข้องกับการกระจายพารามิเตอร์ด้วยส่วนต่าง ๆ ของชื่อของฟังก์ชันหรือเมธอดเดียว หมายเหตุการประกาศฟังก์ชั่นที่เสนอ: function GetTop(x)CustomersOfTheYear(y). นี่เป็นฟังก์ชั่นเดียวที่ไม่ถูกผูกมัดกับการโทรไปยังสองฟังก์ชั่นที่แตกต่างกัน
คาเลบ

@Caleb ฉันคิดว่าที่นี่เขาพยายามชี้ให้เห็นว่าพารามิเตอร์ infix เหล่านี้เป็นวิธีที่ไม่ยืดหยุ่นในการทำอินเทอร์เฟซที่คล่องแคล่ว (คำตอบนี้) หรือพารามิเตอร์ที่มีชื่อ (คำตอบอื่น) จนถึงตอนนี้ฉันยังไม่เห็นข้อได้เปรียบใด ๆ กับพวกเขาว่าอินเทอร์เฟซ / พารามิเตอร์ที่กำหนดชื่อได้อย่างคล่องแคล่วไม่สามารถทำได้ดีกว่า
Izkata

16

วัตถุประสงค์ -C ทำเช่นนั้น นี่คือต้นแบบทั่วไป:

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

นี่คือวิธีที่คุณเรียกวิธีการดังกล่าว:

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

Objective-C ส่วนใหญ่จะใช้กับ Cocoa สำหรับ Mac OS X และ Cocoa Touch สำหรับ iOS แต่ gcc จะสร้างรหัส Objective-C บนทุกแพลตฟอร์มที่ gcc ทำงาน


ขออภัยกระสุนควรเป็นเครื่องหมายยัติภังค์ ฉันเดายัติภังค์ในข้อความตอบรับถือเป็นมาร์กอัป ยัติภังค์ใน Objective-C ใช้เพื่อประกาศวิธีการที่เป็นของวัตถุ - [foo bar: x] โดยที่ foo เป็นวัตถุหรืออินสแตนซ์ของคลาส - ในขณะที่เครื่องหมายบวกใช้สำหรับวิธีการเรียนสิ่งที่ C ++ หมายถึงฟังก์ชันสมาชิกแบบคงที่
Mike Crawford

13

ใน 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


5

ฉันไม่พบชื่อของมัน แต่มีรูปแบบการออกแบบเพื่อให้ได้สิ่งที่คล้ายกันซึ่งการเรียกใช้ฟังก์ชันส่งคืนวัตถุใหม่ที่แก้ไขตามที่อธิบายไว้ ตัวอย่างเช่น:

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

ไม่ได้ใช้บ่อยนักเนื่องจากข้อมูลของคุณจะต้องมีมุมฉากมากเพื่อหลีกเลี่ยงความซับซ้อนที่ไม่สามารถจัดการได้ภายใต้ประทุน แต่อาจมีประโยชน์ในสถานการณ์ที่เหมาะสม


6
สิ่งนี้เรียกว่าสไตล์การออกแบบส่วนต่อประสานที่คล่องแคล่ว
Jesper

@Jesper สิ่งที่ฉันเห็นคล้ายกับ jQuery chaining ฉันถูกไหม?
Saeed Neamati

ใช่ @Saeed, jQuery ใช้สไตล์นี้
Karl Bielefeldt

5

Python มีพารามิเตอร์คำสำคัญ ตัวอย่างนิยามฟังก์ชัน

def getTopCustomers(count,year):
...

ตัวอย่างการเรียกใช้ฟังก์ชัน

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

(ฉันเข้าใจว่าสิ่งนี้ไม่ได้อยู่ในจิตวิญญาณของคำถามเดิม แต่หากพารามิเตอร์คำหลักในเสียงกระเพื่อมมีคุณสมบัติเหมาะสมทำเช่นนี้ใน Smalltalk และ Objective-C อย่างไรก็ตามคำหลักระหว่างอาร์กิวเมนต์เป็นส่วนหนึ่งของชื่อฟังก์ชัน / การค้นหาจริงๆ .)


โดยส่วนตัวฉันชอบสิ่งนี้ดีกว่าสำหรับสิ่งนี้จะช่วยให้คุณมีตัวเลือกในการเรียกใช้ฟังก์ชันโดยไม่มีชื่อพารามิเตอร์ถ้าคุณทราบลำดับของพารามิเตอร์
Pablo Mescher

4

Agda มีรูปแบบ mixfix

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

 if cond then x else y

เมื่อใดก็ตามที่ฟังก์ชั่นตั้งชื่อด้วยเครื่องหมายขีดล่างก็สามารถแบ่งออกเป็นสองส่วนโดยมีข้อโต้แย้งในระหว่าง


4

ในขณะที่ไม่เป็นภาษาโปรแกรมต่อ se , แตงกวาใช้พารามิเตอร์ในช่วงกลางของชื่อฟังก์ชันซึ่งอาจรวมถึงช่องว่างและมีความหมายให้มีลักษณะเหมือนภาษาอังกฤษ

อย่างไรก็ตามฟังก์ชัน 'ถูกกำหนดใน 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

ใน 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 ช่วยให้คุณสามารถกำหนดค่า lexer อีกครั้งและด้วย\afterassignmentมาโครที่ฉันใช้ด้านบนคุณสามารถใช้โพรซีเดอร์ในตัวเพื่อใช้หมายเลข lex มันมีประโยชน์มากในการกำหนดโปรโตคอลการโทรสั้น ๆ ตัวอย่างเช่นมีความเป็นไปได้อย่างมากที่จะเขียนมาโครทำความเข้าใจกับเครื่องหมาย Markdown ของตาราง

ตอนนี้คุณถาม“ ฉันจะเข้าถึงฐานข้อมูลของฉันที่เก็บลูกค้าจาก TeX ได้อย่างไร” แต่นี่เป็นคำถามอื่น :)

ในเสียงกระเพื่อมสามัญนี่เป็นไปได้แน่นอนที่จะกำหนด queryแมโครที่อนุญาตให้คุณเขียน

(query getTopCustomers 50 OfTheYear 2010)

โดยที่ getCustomers และ OfYYear ถูกตีความเป็นสัญลักษณ์ ดังนั้นจึงเป็นหน้าที่ของมาโครที่จะต้องเข้าใจ เสียงกระเพื่อมสามัญเป็นเลิศในโดเมนของการอ่านรหัส (ใช่ฉันหมายความว่ามัน!) เพราะระบบมาโครช่วยให้สามารถสร้างภาษาเทียมหลอกสำหรับแอปพลิเคชันของคุณได้อย่างง่ายดาย (ฉันคิดว่าพวกเขาเรียกว่าภาษาแอปพลิเคชัน)

PS: ดูเหมือนว่าไม่มีใครอ้าง C ++ ที่ใกล้เคียงที่สุดที่คุณจะได้รับ (โดยไม่มีตัวประมวลผลล่วงหน้า) คือ

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

เคล็ดลับคือการให้getTopCustomersผลตอบแทนอ้างอิงquery(หรือสิ่งอื่น) OfTheYearที่ยังดำเนินการ คุณสามารถสร้างตัวอย่างนี้จนถึงภาษาคิวรีขนาดเล็ก แต่คุณต้องระบุคุณสมบัติสุดท้าย (ส่งคืนค่า) หรือเพิ่มfinaliseวิธีการ (ทำการค้นหาและส่งคืนค่า) หากคุณรู้สึกว่ามันคุณสามารถเลียนแบบสตรีมคอนโทรลเลอร์ของ STL และสามารถเขียนสิ่งต่าง ๆ เช่น

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

แต่สิ่งนี้กำลังดำเนินไปในทิศทางของภาษาแอปพลิเคชันอีกครั้ง

แก้ไข: ฉันมองข้ามคำตอบ @han ซึ่งอ้างถึง Common LISP และ C ++ (แต่ไม่ใช่ TeX!)


2

ใน JavaScript หรือภาษาอื่น ๆ ที่สนับสนุนการปิดคุณสามารถแกงฟังก์ชั่นเช่นนี้:

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);

1
+1 เพราะสิ่งนี้น่าสนใจ แต่โปรดจำไว้ว่า '20' ใน top20Func นั้นไม่ใช่พารามิเตอร์อีกต่อไป แต่เป็นส่วนหนึ่งของชื่อที่เตือนให้คุณทราบถึงพารามิเตอร์ คุณสามารถพูดได้อย่างง่ายดาย: var top5Func = getTopCustomersFunc(37);. ว่า '5' เป็นความเข้าใจผิดที่นี่ top37Funcแต่รหัสทำงานตรงเช่นเดียวกับถ้าตัวแปรได้รับการแต่งตั้ง
แม็กเคเล็บ

1

ขึ้นอยู่กับคำจำกัดความของคุณของ "ภาษา" แต่กรอบการทดสอบหุ่นยนต์กรอบช่วยให้คุณกำหนดคำหลักด้วยวิธีนี้ จากเอกสารของพวกเขาเกี่ยวกับข้อโต้แย้งที่ฝัง :

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

ข้างต้นประกาศคำหลักใหม่ (ฟังก์ชั่นหลัก) ชื่อ "select $ {animal} จากรายการ" โดยที่ '$ {animal}' เป็นพารามิเตอร์ คุณเรียกมันว่า "select cat from list"


ดูเหมือนว่าฉันจะชอบคำสั่ง SQL +1
Saeed Neamati

1

แจ้ง 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.

และอื่น ๆ


3
สิ่งนี้ไม่ได้อธิบายอย่างชัดเจนว่าการทำงานของไวยากรณ์ของภาษานั้นเป็นอย่างไร หลายคนไม่คุ้นเคยกับภาษาแจ้งและไม่สามารถแยกพารามิเตอร์จากการโทรหรือการใช้งานในส่วนอื่น ๆ ของรหัส

ฉันรู้สึกทึ่งกับภาษานี้ คำตอบนั้นค่อนข้างสั้นโดยมีเพียงตัวอย่างโค้ดที่ไม่มีการแบ่งสรร แต่ตัวอย่างก็ถูกกำหนดโดย OP (แม้ว่าจะมีภาษาทั่วไปมากกว่า) Wikiมีบทความที่น่าอ่าน
YoYo

0

คำหลักของ 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ไม่บังคับใช้ จะต้องมีบางสิ่งที่มีการข้ามพวกเขาทั้งหมดเป็นข้อผิดพลาด แต่เนื่องจากแมโครเพิ่งจบลงด้วยการละทิ้งพวกเขามันไม่สำคัญเลยว่าพวกมันจะเกินความสามารถในการอ่าน (ซึ่งสำคัญ)

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

-2

ใน Clojure เป็นเรื่องปกติที่จะใช้อาร์กิวเมนต์คำหลักสำหรับสถานการณ์เช่นนี้เช่น:

(get-customers :top 50 :year 2010)

อาร์กิวเมนต์คำหลักมีความยืดหยุ่นพอสมควรสามารถเลือกหรือไม่ก็ได้และมีค่าเริ่มต้นที่ระบุเป็นต้น


-4

คุณสามารถจำลองสิ่งนี้ได้ในไพ ธ อน ตัวอย่างเช่น,

def GetTop(customers, ofYear):
  #write some code here to get the customers

print GetTop(customers=50 ofYear=2010)

หรือแม้กระทั่ง

def GetTop(**args):
  #write some code here using the same parameter names as above

print GetTop({customers: 50, ofYear: 2010})

1
ไวยากรณ์ในตัวอย่างที่สองของคุณไม่ถูกต้อง นอกจากนี้มีคนโพสต์ข้อความนี้แล้ว
Winston Ewert

จุดนี้ซ้ำเพียงทำ (และอธิบายได้ดีขึ้นมาก) ในคำตอบก่อนหน้านี้ที่โพสต์เมื่อ 3 ปีก่อน
ริ้น
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.