2011-11-18 37 views
12

Tôi đang gặp một số khó khăn để tìm cách sử dụng biểu mẫu "let". Trong ví dụ dưới đây, tôi muốn liên kết cục bộ giá trị "cols" để làm việc trên nó sau này trong hàm. Những gì tôi nhận thấy, tuy nhiên, là nếu tôi sử dụng "cho" chức năng sel-opt-tmp sẽ trả về một giá trị nil thay vì một danh sách.Clojure: để phạm vi và chức năng trả về giá trị

(defn sel-opt-tmp [] 
    (let [cols "test"])) 

(prn (sel-opt-tmp)) 

* Mã trên trả về giá trị bằng 0.

Tôi hiểu rằng "cho phép" chỉ liên kết một giá trị trong phạm vi chức năng, những gì tôi không biết là nếu có cách để chuyển giá trị ra khỏi phạm vi cho phép. Có lẽ có cái gì đó giống như "trở lại" mà tôi không biết? Hoặc điều này chỉ đơn giản là thiết kế xấu và tôi không nên sử dụng ràng buộc ở tất cả trong trường hợp này (điều này có xu hướng tạo ra chuỗi dài các chức năng khó đọc mặc dù)?

+2

Biểu mẫu 'let' hoàn trả về biểu thức cuối cùng chứa trong đó, trong trường hợp của bạn là ẩn nil'. Bạn cần sử dụng 'cols' trong phần thân của biểu mẫu' let' để trả về nó. – seh

+0

'" let "chỉ liên kết một giá trị trong phạm vi của hàm' - điều đó không hoàn toàn đúng. 'let' có thể xuất hiện hầu hết mọi nơi, và phạm vi của các tên bị ràng buộc là biểu thức 'let'. –

Trả lời

17

Nó trả về 0 vì nội dung của câu lệnh let trống (hoặc không). Hãy thử:

(let [cols "test"] cols)

Mà sẽ trả về giá trị của cols. Như seh nói, một câu lệnh let đánh giá giá trị của biểu thức con cuối cùng của nó.

+1

Biểu mẫu 'let' chính nó là một biểu thức, mà * đánh giá * với giá trị của biểu thức con cuối cùng của nó! –

+0

Cảm ơn Matt, tôi đã cập nhật từ ngữ. Không biết tại sao trước đây tôi không ... –

3

Không có vấn đề gì với việc chuyển các giá trị ra ngoài phạm vi như bạn đề cập. Các ràng buộc cols chỉ có hiệu lực trong phạm vi, nhưng tuổi thọ của giá trị của (:ks cols) không bị hạn chế tương tự. (Đó là lý do tại sao bạn có bộ sưu tập rác: bạn có thể trả lại giá trị trỏ đến dữ liệu và dữ liệu vẫn tồn tại miễn là có tham chiếu đến nó.)

Nếu bạn nhận được nil từ hàm, điều đó có nghĩa là cols không có khóa :ks ... hoặc thực sự có thể không phải là bản đồ. Kể từ cols là kết quả từ filter, nó là một chuỗi và khi từ khóa :ks được sử dụng làm hàm, hàm trả về 0 cho số không phải tập hợp. Để bảo vệ chống lại loại lỗi đó có thể là một quy ước hữu ích để luôn viết (cols :ks) thay vì (:ks cols) để bạn gặp lỗi khi bạn nghĩ bản đồ là cái gì đó khác.

+0

Xin chào, tôi đã thực hiện một thử nghiệm nhỏ và vẫn nhận được một con số không. Mã ở trên. – kfk

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