2008-11-04 26 views
7

Imagine mã REBOL sau:động thêm từ để một bối cảnh trong REBOL

foo: context [bar: 3]

bây giờ tôi có một bối cảnh foo trong đó 'bar được định nghĩa. Làm thế nào tôi có thể tự động chèn một từ mới vào ngữ cảnh này? Có thể không?

Tôi đã thử:

set/any in foo 'baz 3

Nhưng điều đó không làm việc vì biểu thức in foo 'baz thất bại vì không có chữ 'baz định nghĩa trong bối cảnh foo.

tôi nên thêm rằng tôi nhận ra một cách để làm điều này là như sau:

foo-prototype: [bar: 3] 
foo: context foo-prototype 
foo: context head append foo-prototype [baz: 3]

Nhưng nếu bạn không có quyền truy cập vào foo 's khối nguyên mẫu?

Trả lời

8

Bạn có thể đạt được điều tương tự bằng cách sử dụng đối tượng hiện có làm nguyên mẫu để tạo đối tượng mới.

>> foo: make object! [bar: 3] 
>> foo: make foo [baz: 3] 
>> probe foo 
make object! [ 
    bar: 3 
    baz: 3 
] 
+1

Đây là một trong những khía cạnh cơ bản của REBOL, nhưng tại thời điểm tôi hỏi câu hỏi này, tôi không biết bạn có thể làm điều này. –

4

Có một số cách để làm việc xung quanh một thực tế rằng trong REBOL/2 nó chỉ là không posssible để mở rộng bối cảnh đối tượng.

Có lẽ bạn chỉ có thể sử dụng BLOCK s thay vì OBJECT s:!

>> blobject: [foo 1] 
== [foo 1] 
>> blobject/bar 
** Script Error: Invalid path value: bar 
** Near: blobject/bar 
>> append blobject [bar 2] 
== [foo 1 bar 2] 
>> blobject/bar: 3 
== 3 

Bạn thậm chí có thể làm cho 'tự làm việc bằng cách chỉ phụ thêm đối tượng chính nó:

>> insert blobject reduce ['self blobject] 
== [[...] foo 1 bar 2] 
>> same? blobject blobject/self 
== true 

Nhưng khi bạn' đã yêu cầu mở rộng OBJECT! s, bạn có thể dùng giải pháp Peter WA Wood để đơn giản sao chép đối tượng. Chỉ cần nhớ rằng với cách tiếp cận này, bản sao kết quả thực sự là một thứ khác với đối tượng gốc.

Vì vậy, nếu một số từ đã được thiết lập để giữ các đối tượng trước khi sao chép/mở rộng, sau khi nhân bản đối tượng từ đó vẫn sẽ giữ đối tượng unextended:

>> remember: object: make object! [foo: 1] 
>> object: make object [bar: 2] 
>> same? remember object 
== false 
>> probe remember 
make object! [ 
    foo: 1 
] 

Trong trường hợp nó là điều cần thiết để bạn có thể giữ "tài liệu tham khảo" cho các đối tượng còn nguyên vẹn, bạn có thể muốn quấn đối tượng bạn cần phải mở rộng trong một đối tượng bên ngoài như trong

>> remember: object: make object! [access: make object! [foo: 1]] 
>> object/access: make object/access [bar: 2] 
>> same? remember object 
== true 

sau đó, bạn có thể safley mở rộng đối tượng trong khi vẫn giữ, vì bạn chỉ cửa hàng tham chiếu đến container .

REBOL/3, btw, sẽ cho phép thêm từ vào OBJECT! S.

+0

Câu trả lời rất nhiều thông tin! Tôi đã học TON về REBOL kể từ khi tôi đăng câu hỏi này. –

1

Được nêu trong hướng dẫn sử dụng REBOL/Core: "Nhiều khối chứa các khối và chuỗi khác. Khi khối đó được sao chép, chuỗi phụ không được sao chép. dữ liệu chuỗi làm khối ban đầu. "

+0

Đúng nếu tôi sai, nhưng điều này không liên quan đến 'đối tượng!' Thay vì 'khối!' S? –

Các vấn đề liên quan