র‌্যাকেট / স্কিমে গল্ফ করার টিপস


15

র‌্যাকেট / স্কিমে গল্ফ করার জন্য আপনার কাছে কোন সাধারণ টিপস রয়েছে ? আমি এমন ধারণাগুলি সন্ধান করছি যা সাধারণভাবে কোড গল্ফ সমস্যার ক্ষেত্রে প্রয়োগ করা যেতে পারে যা কমপক্ষে কিছুটা র‌্যাকেট / স্কিমের সাথে নির্দিষ্ট (যেমন "মন্তব্যগুলি সরান" কোনও উত্তর নয়)।


আমি সচেতন স্কিম এবং র‌্যাকেট (পূর্বে পিএলটি স্কিম) প্রযুক্তিগতভাবে ভিন্ন ভাষা তবে অনেক উপায়ে একইরকম এবং অনেক কোড (আমার সন্দেহ) বেশিরভাগেরই উদ্দেশ্য অনুসারে চলবে। যদি আপনার টিপটি শুধুমাত্র পূর্বোক্ত ভাষার একটির ক্ষেত্রে প্রযোজ্য, তবে সেগুলি নোট করুন।

উত্তর:


3

এক্সপ্রেশন 'x, `x, ,x, একটি ,@xস্বয়ংক্রিয়ভাবে প্রসারিত (quote x), (quasiquote x), (unquote x), এবং (unquote-splicing x)যথাক্রমে। এটি নিখুঁতভাবে সিন্ট্যাকটিক রূপান্তর, এবং যে কোনও জায়গায় প্রয়োগ করা যেতে পারে। এটি এক-ভেরিয়েবল ফাংশনগুলির জন্য একটি সুবিধাজনক স্বরলিপি দেয়:

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

যা প্রসারিত হয়

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

আমি নিশ্চিত নই যে সিনট্যাক্টিক কীওয়ার্ডকে ছায়া দেওয়ার জন্য শব্দার্থক শব্দ যেমন quoteবা quasiquoteসীমাবদ্ধ ভেরিয়েবল সহ, যদিও উপরোক্ত কোডটি আমি দোভাষীর ক্ষেত্রে কাজ করেছি এবং unquote-splicingএটি আদর্শের চেয়ে কম কারণ এটি দ্বি-অক্ষরের সংক্ষেপণ রয়েছে, তবে unquoteএক-অক্ষর সংক্ষেপণ সহ সহায়ক সিনট্যাক্স এবং তাই এই হ্যাকের জন্য আদর্শ।


8

ইন কোলাহল , λএবং lambdaবেনামী ফাংশন নির্মাণের জন্য সমার্থক কীওয়ার্ড আছে, কিন্তু λ2 বাইট কোথায় lambda6।

ইন স্কিম , এমন কোনো শব্দ নেই λএবং আপনার সাথে আটকে করছি lambda


6

~aসংখ্যা এবং চিহ্নগুলিকে স্ট্রিংয়ে রূপান্তর করতে ব্যবহার করুন ।


5

ব্যবহার করার সময় কোলাহল , বাঁধাই করা ভেরিয়েবল ব্যবহার λকয়েক বাইট বন্ধ শেভ। ইন স্কিম , lambdaযদি না এক চার বা তার বেশি ভেরিয়েবল বাঁধাই করা হবে, এই কৌতুক প্রযোজ্য নয় তোলে।

উদাহরণ: একটি পরিবর্তনশীল 2 বাইট ওভার let/define

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

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

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

আমি এই বাঁধাই কল করব না। আপনি বিভিন্ন ফাংশন ব্যবহার করছেন। কিছু ক্ষেত্রে, একটি বেনামে ফাংশন ব্যবহার করা একটি ভেরিয়েবলকে বাঁধার চেয়ে কম sh
মাইকেল Vehrs

আমি নিশ্চিত নই যে আপনার মতামত স্কিম চেনাশোনাগুলিতে ব্যবহৃত সাধারণ পরিভাষার সাথে কী করবে । আমি নিশ্চিত করতে পারি আপনি উভয় উপায় একটি আভিধানিক সুযোগ ভেরিয়েবল বাঁধাই করা হয়, এবং letপ্রায়ই পরিপ্রেক্ষিতে বাস্তবায়িত হয় lambda
উইনি

5

ইন কোলাহল , requireফরম একাধিক আর্গুমেন্ট থাকতে পারে।

(require net/url net/uri-codec)

এর চেয়ে ছোট উপায়

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

আমি স্কিম সম্পর্কে খুব বেশি জানি না , তবে এটি কোনও requireবিল্টিন বলে মনে হচ্ছে না ।


5

সংক্ষিপ্ত প্রতিশব্দ ব্যবহার করুন

র‌্যাকেটে বেশ কয়েকটি পদ্ধতি রয়েছে যার বেশিরভাগ সমতুল্য সংক্ষিপ্ত সংস্করণ রয়েছে। (এগুলি সাধারণত সমতুল্য নয়: উদাহরণস্বরূপ, (car (cons 1 2))যেখানে (first (cons 1 2))ব্যর্থ হয় সেখানে কাজ করে But তবে আপনি যদি জানেন যে এগুলি আপনার ক্ষেত্রে প্রতিশব্দ) you

এই তালিকা সম্ভবত অসম্পূর্ণ: আমি সম্ভবত এই তালিকায় যেতে পারে যে বেশিরভাগ জিনিস সম্পর্কে জানি না।

  • (= a b)(equal? a b)সংখ্যার তুলনা করার পরিবর্তে
  • '(1 2)পরিবর্তে (list 1 2)
  • car, cadr, cdrজন্য first, secondএবং rest
  • null? পরিবর্তে empty?
  • moduloপরিবর্তে remainderযখন মডুলাসটি ইতিবাচক হয়।
  • floorপরিবর্তে truncateযখন তার যুক্তিটি ইতিবাচক হয়।

4

অযথা ফাঁকা জায়গা ছাড়ুন mit

এটি একটি "তুচ্ছ" টিপ হিসাবে বিবেচনা করা যেতে পারে, তবে এটি কোথাও নির্দেশ করতে হবে।

আপনি যখনই সাধারণ লোকদের দ্বারা র‌্যাকেট কোড পড়েন (যেমন র‍্যাকেট ডকুমেন্টেশনে ) এতে সমস্ত স্পেস রাখা হবে: উদাহরণস্বরূপ,

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

আসলে, যেহেতু (এবং )চলক নামের অংশ হতে পারে না, তাই আমরা তাদের চারপাশের সমস্ত স্পেস মুছতে পারি এবং কোনও অস্পষ্টতা হারাতে পারি না (এবং আরও গুরুত্বপূর্ণ, এখনও বৈধ কোড পাওয়া যায়) সুতরাং উপরের অভিব্যক্তি পরিবর্তে হতে পারে:

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

2

নিম্নলিখিত টিপস র‌্যাকেটের জন্য :

ডিফল্ট আর্গুমেন্ট

প্রায়শই ব্যবহৃত হয় দীর্ঘ ফাংশন নামের জন্য উপকরণ তৈরি করার জন্য বিশেষত দরকারী।

ধরুন গল্ফ আপনাকে এমন একটি ফাংশন লিখতে দেয় যা আর্গুমেন্ট গ্রাস করে এবং ধরে নিই যে আপনাকে reverseপ্রচুর পরিমাণে ব্যবহার করা দরকার । আপনি এরকম কিছু দিয়ে শুরু করবেন:

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

পরিবর্তে আপনি একটি সংক্ষিপ্ত নাম সহ একটি অতিরিক্ত যুক্তি গ্রহণ করতে পারেন reverseএবং এর ডিফল্ট মান সেট করতে পারেন reverse:

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

তদুপরি, আপনার যদি কোনও সহায়ক ফাংশন থাকে যা আপনি একই জায়গায় কিছু যুক্তি দিয়ে অনেক জায়গায় ব্যবহার করেন it's প্রয়োজন হিসাবে ফাংশনে আর্গুমেন্টগুলি পুনরায় অর্ডার করতে মনে রাখবেন, যাতে আপনি যথাসম্ভব ডিফল্ট আর্গুমেন্টগুলি ব্যবহার করতে পারেন এবং একাধিক কলসাইট থেকে আর্গুমেন্টগুলি সরিয়ে ফেলতে পারেন।

match

এটি একটি ছোট পোস্টে সংক্ষিপ্ত করে তুলতে আরও কঠিন, সুতরাং এটির জন্য র‌্যাকেট ডক্সে পড়ুন । সংক্ষেপে, matchআপনাকে একটি তালিকা থেকে একটি নির্দিষ্ট ক্রমে উপাদানগুলির উপাদান এবং ক্রমগুলি বের করার অনুমতি দেয় এবং চতুর্ভুজ বাক্য গঠন আপনাকে বিভক্ত তালিকাটি আবার একসাথে সেলাই করতে দেয়:

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

এটি আপনাকে নিয়মিত প্রকাশের সাথে কাজ করার এবং পরে ফলাফলকারী গ্রুপগুলিতে অতিরিক্ত গণনা করার একটি সহজ উপায়ও দেয়,

নামে let

নামের সিনট্যাক্সটি এখানে দেখুনlet proc-id ...

এটি আপনাকে পুনরাবৃত্ত ফাংশনগুলি লেখার অনুমতি দেয় যা তত্ক্ষণাত ডাকা হয় defineবা আসলে ফাংশনটি সংজ্ঞায়িত করার পরে কল না করে বলা হয়।

কিছুটা এইরকম:

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

সংক্ষিপ্ত করা যেতে পারে:

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


এই শেষ নিরীহ, কিন্তু আমি যে কোন জায়গায় এতদূর এই সামান্য কৌতুক ব্যবহার করতে পারবেন না করা হয়:
(apply map list matrix)একটি TRANSPOSE লাগে matrix, যেখানে matrixতালিকার কিছু আয়তক্ষেত্রাকার তালিকা, মত '((1 2 3) (a b c))
যদি এটি কার্যকর হিসাবে প্রমাণিত হয় তবে আমাকে জানান।


আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.