Mẹo chơi gôn trong Vợt / Lược đồ


15

Bạn có lời khuyên chung nào cho việc chơi golf trong Vợt / Lược đồ ? Tôi đang tìm kiếm những ý tưởng có thể được áp dụng cho các vấn đề về golf nói chung ít nhất là cụ thể đối với Vợt / Lược đồ (ví dụ: "xóa bình luận" không phải là một câu trả lời).


Tôi biết SchemeVợt (trước đây là PLT Scheme) là các ngôn ngữ khác nhau về mặt kỹ thuật nhưng khá giống nhau về nhiều mặt và nhiều mã (tôi nghi ngờ) sẽ chạy chủ yếu như dự định. Nếu mẹo của bạn chỉ áp dụng cho một trong những ngôn ngữ nói trên, hãy lưu ý như vậy.

Câu trả lời:


3

Các biểu thức 'x, `x, ,x, một ,@xcách tự động mở rộng ra (quote x), (quasiquote x), (unquote x), và (unquote-splicing x), tương ứng. Đây hoàn toàn là một chuyển đổi cú pháp, và có thể được áp dụng ở bất cứ đâu. Điều này cung cấp một ký hiệu thuận tiện cho các hàm một biến:

; Defining a function:
(define ,x (+ x x))
; Calling a function:
(display ,2)

mở rộng ra

; Defining a function:
(define (unquote x) (+ x x))
; Calling a function:
(display (unquote 2))

Tôi không chắc về ngữ nghĩa để tạo bóng cho một từ khóa cú pháp như quotehoặc quasiquotevới một biến bị ràng buộc, mặc dù mã như trên đã làm việc trong các trình thông dịch mà tôi đã kiểm tra, và unquote-splicingít lý tưởng hơn vì nó có chữ viết tắt hai ký tự, nhưng unquotelà một cú pháp phụ trợ với chữ viết tắt một ký tự và vì vậy rất lý tưởng cho bản hack này.


8

Trong vợt , λlambdalà các từ khóa đồng nghĩa cho việc xây dựng các chức năng ẩn danh, nhưng λlà 2 byte nơi lambdalà 6.

Trong Đề án , không có từ khóa như vậy λvà bạn bị mắc kẹt với lambda.


6

Sử dụng ~ađể chuyển đổi số và ký hiệu thành chuỗi.


5

Khi sử dụng vợt , liên kết các biến bằng cách sử dụng λđể loại bỏ một vài byte. Trong Đề án , lambdalàm cho thủ thuật này không áp dụng được, trừ khi một ràng buộc bốn hoặc nhiều biến.

Ví dụ: Một biến lưu 2 byte trên let/define

(define n 55)(* n n) ; 20 bytes

(let([n 55])(* n n)) ; 20 bytes

((λ(n)(* n n))55) ; 18 bytes

Tôi sẽ không gọi đó là ràng buộc. Bạn đang sử dụng các chức năng khác nhau. Trong một số trường hợp, sử dụng hàm ẩn danh ngắn hơn ràng buộc một biến.
Michael Vehrs

Tôi không chắc ý kiến ​​của bạn liên quan gì đến thuật ngữ điển hình được sử dụng trong vòng tròn sơ đồ. Tôi có thể đảm bảo với bạn cả hai cách là các biến ràng buộc với phạm vi từ vựng và thường được thực hiện theo các điều khoản . letlambda
Winny

5

Trong vợt , requirecác hình thức có thể có nhiều đối số.

(require net/url net/uri-codec)

Là cách ngắn hơn

(require net/url)(require net/uri-codec)

Tôi không biết nhiều về Scheme , nhưng dường như nó không có requirenội dung.


5

Sử dụng các từ đồng nghĩa ngắn hơn

Có một số quy trình trong Vợt có các phiên bản ngắn hơn tương đương. (Chúng thường không tương đương: ví dụ: (car (cons 1 2))hoạt động khi (first (cons 1 2))thất bại. Nhưng bạn có thể thay thế nếu bạn biết chúng là từ đồng nghĩa trong trường hợp của bạn.)

Danh sách này có lẽ chưa đầy đủ: tôi có thể chưa biết về hầu hết những điều có thể có trong danh sách này.

  • (= a b)thay vì (equal? a b)khi so sánh số.
  • '(1 2)thay vì (list 1 2).
  • car, cadr, cdrCho first, second, và rest.
  • null? thay vì empty?
  • modulothay vì remainderkhi mô đun là dương.
  • floorthay vì truncatekhi lập luận của nó là tích cực.

4

Bỏ qua không gian không cần thiết

Đây có thể được coi là một mẹo "tầm thường", nhưng nó phải được chỉ ra ở đâu đó.

Bất cứ khi nào bạn đọc mã vợt được viết bởi người bình thường (ví dụ: trong tài liệu về vợt ), nó sẽ có tất cả các khoảng trắng được đặt vào: ví dụ:

(append (list 1 2) (list 3 4) (list 5 6) (list 7 8))

Trên thực tế, vì ()không thể là một phần của tên biến, chúng ta có thể xóa tất cả các khoảng trắng xung quanh chúng và không mất bất kỳ sự mơ hồ nào (và quan trọng hơn là vẫn nhận được mã hợp lệ). Vì vậy, biểu thức trên có thể thay vào đó là:

(append(list 1 2)(list 3 4)(list 5 6)(list 7 8))

2

Các mẹo sau đây dành cho vợt :

Đối số mặc định

Đặc biệt hữu ích để tạo bí danh cho các tên hàm dài được sử dụng thường xuyên.

Giả sử golf cho phép bạn viết một hàm tiêu thụ đối số và giả sử bạn cần sử dụng reversenhiều. Bạn sẽ bắt đầu với một cái gì đó như:

(λ(x) ... reverse ... reverse ... reverse ...

Thay vào đó, bạn có thể tham gia một đối số bổ sung, với tên ngắn hơn reversevà đặt giá trị mặc định của nó thành reverse:

(λ(x[r reverse]) ... r ... r ... r ...

Hơn nữa, nó hữu ích nếu bạn có chức năng trợ giúp mà bạn sử dụng ở nhiều nơi với một số đối số tương tự. Hãy nhớ sắp xếp lại các đối số cho hàm nếu cần, để bạn có thể sử dụng càng nhiều đối số mặc định càng tốt và xóa các đối số khỏi nhiều lệnh gọi.

match

Bài này khó hơn một chút để tóm tắt trong một bài viết nhỏ, vì vậy hãy đọc trên Tài liệu vợt cho bài này. Tóm lại, matchcho phép bạn trích xuất các phần tử và chuỗi các phần tử theo một thứ tự nhất định từ một danh sách và cú pháp quasiquote cho phép bạn ghép danh sách bị cắt lại với nhau:

(match (range 10)
 [`(,xs ... 3 ,ys ... 6 ,zs ...)
  `(,@(map f xs) 3 ,@(map f ys) 6 ,@(map f sz))]
 ...

Nó cũng cung cấp cho bạn một cách dễ dàng để làm việc với các biểu thức thông thường và thực hiện tính toán bổ sung cho các nhóm kết quả sau đó,

Đặt tên let

Xem cú pháp được đặt tên ở đây .let proc-id ...

Điều này cho phép bạn viết các hàm đệ quy được gọi ngay lập tức mà không definehoặc thực sự gọi hàm sau khi bạn đã xác định nó.

Cái gì đó như:

(define (fib i)
  (if (< i 2) i
      (+ (fib (- i 1)) (fib (- i 2)))))
(fib 10)

có thể rút ngắn thành:

(let fib {[i 10]}
  (if (< i 2) i
      (+ (fib (- i 1)) (fib (- i 2)))))


Cái cuối cùng này thật ngớ ngẩn, nhưng tôi chưa thể sử dụng thủ thuật nhỏ này ở bất cứ đâu cho đến nay:
(apply map list matrix)chuyển vị trí matrix, trong đó matrixcó một số danh sách hình chữ nhật của danh sách, như thế nào '((1 2 3) (a b c)).
Hãy cho tôi biết nếu điều này không hữu ích.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.