วางแผนและตั้งค่า!

ฉันจะเปลี่ยนค่าของตัวแปรผ่านฟังก์ชันที่ใช้พารามิเตอร์ lambda ได้อย่างไร เช่น:

;;definitions
(define test "fails")
(define (experiment input) (set! input "works"))

;;interactions
> test
"fails"
> (experiment test)
> test
"fails"

ดูเหมือนว่าจะล้มเหลว..

ความนับถือ


person Hellnar    schedule 10.11.2009    source แหล่งที่มา


คำตอบ (2)


คุณไม่สามารถ -- Scheme ส่งค่าทั้งหมด "ตามค่า" ดังนั้นในฟังก์ชัน experiment ด้านบนเพียงแก้ไขอาร์กิวเมนต์อินพุตของตัวเอง หากต้องการให้สิ่งนี้ใช้งานได้ คุณสามารถใช้กล่องซึ่งเป็นคอนเทนเนอร์ค่าที่ไม่แน่นอนได้อย่างชัดเจน:

(define test (box "fails"))
(define (experiment input) (set-box! input "works"))
(unbox test)
(experiment test)
(unbox test)

หากคุณ จริงๆ ต้องการเปลี่ยนค่าของตัวแปร คุณสามารถใช้มาโคร:

(define-syntax-rule (experiment input) (set! input "works"))

สิ่งนี้จะสร้าง experiment เป็นมาโคร ซึ่งหมายความว่าทุกแบบฟอร์ม (experiment foo) จะถูกเขียนใหม่เป็น (set! foo "works") สิ่งนี้อาจมีผลกระทบเล็กน้อย ดังนั้นจึงไม่ใช่ความคิดที่ดีที่จะใช้สิ่งนี้ เว้นแต่คุณจะรู้ว่ากำลังทำอะไรอยู่ (ตัวอย่างเช่น (experiment 2) จะล้มเหลวในลักษณะที่ "น่าสนใจ") การเขียนมาโครใน Scheme เป็นเรื่องง่าย แต่การเขียนมาโคร ดี ยังคงยากกว่าการเขียนคำจำกัดความฟังก์ชันใหม่

[โปรดทราบว่าฉันสมมติว่าคุณกำลังใช้ PLT Scheme ในคำตอบนี้ แต่ทั้งสองส่วนสามารถแปลเป็นรูปแบบ "มาตรฐาน" ได้หากจำเป็น ตัวอย่างเช่น ใช้เซลล์ cons ที่ไม่แน่นอนสำหรับเซลล์แรก และใช้ define-syntax กับ syntax-rules สำหรับเซลล์ที่สอง]

person Eli Barzilay    schedule 10.11.2009
comment
ซึ่งสามารถทำได้โดยใช้พารามิเตอร์: srfi.schemers.org/srfi-39/ srfi-39.html - person Jonathan Arkell; 10.11.2009
comment
ใช่ พารามิเตอร์เป็นคอนเทนเนอร์ประเภทหนึ่งที่ไม่แน่นอน (และ PLT มีอีกหลายรายการ เช่น thread-cell) แต่ความหมายของสิ่งเหล่านั้นอาจแตกต่างกันเล็กน้อยจากทั่วโลกธรรมดา ตัวอย่างเช่น พารามิเตอร์มีค่าที่ไม่ซ้ำกันสำหรับแต่ละเธรด (หรือเจาะจงกว่านั้นคือค่าที่ไม่ซ้ำกันสำหรับแต่ละความต่อเนื่อง) - person Eli Barzilay; 11.11.2009

บางทีมันอาจจะสมเหตุสมผลกว่าถ้าคุณพิจารณาโค้ดเดียวกันใน Python:

test = "fails"
def experiment(input):
  input = "works"

>>> test
'fails'
>>> experiment(test)
>>> test
'fails'
person newacct    schedule 10.11.2009
comment
สิ่งนี้ตอบคำถามได้อย่างไร? - person Vijay Mathew; 11.11.2009