2016-05-25 46 views
7

Sử dụng REBOL/Xem 2.7.8 Core, tôi muốn chuẩn bị bố cục xem trước bằng cách tự động gán các từ cho các mục bố cục khác nhau, như trong ví dụ sau. Thay vìBố cục REBOL: Cách tự động tạo các từ bố cục - từ không có ngữ cảnh?

prepared-view: [across 
       cb1: check 
       label "Checkbox 1" 
       cb2: check 
       label "Checkbox 2" 
       cb3: check 
       label "Checkbox 3" 
       cb4: check 
       label "Checkbox 4" 
       ] 
    view layout prepared-view 

vì vậy tôi sẽ giống như những lời cb1-cb5 được tạo ra tự động, ví dụ:

prepared-view2: [ across ] 
    for i 1 4 1 [ 
     cbi: join "cb" i 
     cbi: join cbi ":" 
     cbi: join cbi " check" 
     append prepared-view2 to-block cbi 
     append prepared-view2 [ 
     label ] 
     append prepared-view2 to-string join "Checkbox " i 
     ] 
    view layout prepared-view2 

Tuy nhiên, trong khi difference prepared-view prepared-view2 show không khác biệt trong khối được phân tích cú pháp (== []) , tập lệnh thứ hai dẫn đến lỗi:

** Script Error: cb1 word has no context 
    ** Where: forever 
    ** Near: new/var: bind to-word :var :var 

Tôi đã dành nhiều giờ cố gắng hiểu tại sao, và tôi nghĩ bằng cách nào đó những từ mới cần phải được ràng buộc với bối cảnh cụ thể, nhưng tôi vẫn chưa tìm ra giải pháp nào cho vấn đề.

Tôi cần làm gì?

Trả lời

2
bind prepared-view2 'view 
view layout prepared-view2 

tạo các kết buộc chính xác.

Và đây là một cách khác để tự động tạo bố trí

>> l: [ across ] 
== [across] 
>> append l to-set-word 'check 
== [across check:] 
>> append l 'check 
== [across check: check] 
>> append l "test" 
== [across check: check "test"] 
>> view layout l 

Và sau đó bạn có thể sử dụng vòng lặp để tạo ra các biến nhau để thêm vào bố trí của bạn.

+0

Có thể giúp ích rất nhiều, cảm ơn bạn! –

2

Khi bạn sử dụng TO-BLOCK để chuyển đổi chuỗi thành một khối, đó là thao tác cấp thấp không đi qua liên kết "thông thường" với ngữ cảnh "mặc định". Tất cả các từ sẽ không ràng buộc:

>> x: 10  
== 10 

>> code: to-block "print [x]" 
== [print [x]] 

>> do code 
** Script Error: print word has no context 
** Where: halt-view 
** Near: print [x] 

Vì vậy, khi bạn muốn xây dựng mã từ dây thô trong thời gian chạy mà tra cứu sẽ làm việc, một lựa chọn là sử dụng LOAD và nó sẽ làm điều gì đó mặc định-ish, và điều đó có thể làm việc cho một số mã (bộ nạp là cách các ràng buộc đã được thực hiện cho mã bạn đang chạy mà đến từ nguồn):

>> x: 10 
== 10 

>> code: load "print [x]" 
== [print [x]] 

>> do code 
10 

hoặc bạn có thể đặt tên cho bối cảnh/đối tượng một cách rõ ràng (hay dưới hình thức của một từ mẫu mực bị ràng buộc vào bối cảnh đó) và sử dụng BIND.

+0

... vì vậy tôi chỉ đơn giản là thay đổi 'chắp thêm chuẩn bị-view2 để khối cbi' để' nối thêm chuẩn bị-view2 tải cbi' ... có, mà hoạt động! –

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