লেক্সিকাল বাইন্ডিং দিয়ে ভিতরে ডিফুন বাইট-কম্পাইল সতর্কতা দেয় "ফাংশনটি সংজ্ঞায়িত করা হয় না"


13

বন্ধ করার জন্য লেক্সিকাল বাইন্ডিং এর defunভিতরে ব্যবহার করে আমি একটি স্থিতিশীল ভেরিয়েবলের প্রভাব পেতে চাই let। যাইহোক, ফাইলটি বাইট-সংকলন করার সময়, আমি একটি সতর্কতা পাই। আমি কি কিছু ভুল করছি, না হলে, এই সতর্কতা দমনের কোনও উপায় আছে?

আমি একটি এমসিভিই তৈরি করেছি:

;; -*- lexical-binding: t -*-

(let ((count 0))
  (defun increase-count ()
    (interactive)
    (setq count (1+ count))
    (message "Count is: %d" count))

  ;; The warning happens here.
  (increase-count))

কোডটি প্রত্যাশার মতো কাজ করে: ফাংশনটি increase-count"গণনাটি হ'ল: এন" প্রিন্ট করে যেখানে n বলা হয় প্রতিবারই এটি বৃদ্ধি করে। যাইহোক, এই ফাইলটি বাইট-সংকলন করার সময় আমি নিম্নলিখিত সতর্কতাটি পাই:

In end of data:
mcve.el:11:1:Warning: the function ‘increase-count’ is not known to be
    defined.

এটি আমার increase-countকাছে মনে হয় লেট-ব্লকের শেষে ডাকা হওয়ার আগে সর্বদা সংজ্ঞায়িত করা উচিত। এটা কি না?


defunআপনি যা ভাবেন তা করেন না এটি সর্বদা একটি উচ্চ-স্তরের সংজ্ঞা তৈরি করে। এলিস্প সব পরে স্কিমে নয় ...
ama ই

2
আমি সচেতন যে এটি একটি শীর্ষ স্তরের সংজ্ঞা তৈরি করে; এটাই সেটা যা আমি চাই. আমি কেবল শীর্ষ স্তরের সংজ্ঞাটি বন্ধ হতে চাই be বাইট-সংকলনের এই সতর্কতা ব্যতীত এটি যেমনভাবে চাইছে তেমন কাজ করছে বলে মনে হচ্ছে।
কিঙ্কেল

উত্তর:


7

কোনও ফাংশনটি সংজ্ঞায়িত করা হবে কিনা তা বাইট-সংকলকের সিদ্ধান্ত নেওয়ার উপায়টি খুব "নিষ্পাপ" এবং আপনার "স্পষ্টত" ক্ষেত্রে এমনকি বোকা হয়ে যায়। তবে আপনি এটি এমনভাবে লিখতে পারেন যা সংকলকটি বুঝতে পারে যে কী হয়:

(defalias 'increase-count
  (let ((count 0))
    (lambda ()
      (interactive)
      (setq count (1+ count))
      (message "Count is: %d" count))))

অবশ্যই, বাইট-সংকলকটির যুক্তিটি উন্নত করা আরও ভাল হবে: প্যাচগুলি তার জন্য স্বাগত।


5

বাইট-সংকলক সতর্কতা দমন করতে, কলাম 0 (বামদিকে) থেকে শুরু করে আপনার কোডের আগে এটি যুক্ত করার চেষ্টা করুন:

(declare-function increase-count "your-file-name.el")

C-h f declare-function আপনাকে বলে:

declare-functionএটি একটি লিস্প ম্যাক্রো subr.el

(declare-function FN FILE &optional ARGLIST FILEONLY)

বাইট-কম্পাইলার যে ফাংশন বলুন FNসংজ্ঞায়িত করা হয়, FILEFILEযুক্তি বাইট-কম্পাইলার দ্বারা ব্যবহার করা হয় না, কিন্তু দ্বারা check-declareপ্যাকেজ, যা চেক যে ফাইলের জন্য একটি সংজ্ঞা রয়েছে FN

FILEহয় লিস্প ফাইল (এক্ষেত্রে ".el" এক্সটেনশনটি alচ্ছিক ) বা সি ফাইল হতে পারে। সি ফাইলগুলি ইমাক্স "src/"ডিরেক্টরিটির তুলনায় প্রসারিত হয় । লিস্প ফাইলগুলি ব্যবহারের জন্য অনুসন্ধান করা হয় locate-library, এবং যদি এটি ব্যর্থ হয় তবে এগুলি ঘোষণামূলক ফাইলের অবস্থানের তুলনায় প্রসারিত হয়। একটি FILEএকটি সঙ্গে "ext:"উপসর্গ একটি বহিস্থিত ফাইল। check-declareএই জাতীয় ফাইলগুলি পাওয়া যায় কিনা তা পরীক্ষা করে দেখবে এবং তা না থাকলে ত্রুটি ছাড়াই এড়িয়ে যায়।

Al চ্ছিকর যুক্তিগুলি ARGLISTনির্দিষ্ট করে FNবা যুক্তি tনির্দিষ্ট করে না FN। এটিকে বাদ দেওয়া ARGLISTডিফল্ট t, না nil: একটি nil ARGLISTখালি যুক্তি তালিকাটি নির্দিষ্ট করে এবং একটি স্পষ্টতই t ARGLISTহ'ল একটি স্থানধারক যা পরবর্তী আর্গ সরবরাহ করার অনুমতি দেয়।

Nonচ্ছিক FILEONLYঅ- nilঅর্থ যা check-declareকেবল এটি FILEবিদ্যমান তা যাচাই করবে , এটি এটি সংজ্ঞায়িত করে না FN। এটি ফাংশন সংজ্ঞাগুলির জন্য উদ্দেশ্যে করা হয়েছে যা সনাক্ত check-declareকরে না, যেমন defstruct,।

মনে রাখবেন যে এর উদ্দেশ্যগুলির জন্য check-declare, এই বিবৃতিটি অবশ্যই একটি লাইনের প্রথম অ-সাদা স্থান থাকতে হবে।

আরও তথ্যের জন্য, তথ্য নোড দেখুন (elisp)Declaring Functions


FILEONLYমামলাটি হাতে পাওয়ার জন্য কি নন-নীল যুক্তি প্রয়োজনীয়? বিটিডাব্লু, আমি একই উত্তরটি দিতাম ;-)।
টোবিয়াস

@ তোবিয়াস: FILEONLYএখানে আমার প্রয়োজন হবে বলে মনে হয় না। যা মনে করে যে check-declareএটি ডিফোনগুলি fএবং স্বীকৃতি দেয় g
ড্র হয়েছে

@ ড্রু, আমি মনে করি যে emacs.stackexchange.com/q/39439 এর প্রেক্ষাপটে সর্বশেষ মন্তব্যটি কেবল fএবং এর gঅর্থ উপলব্ধি করে ?
22 19:19

@ ফিলস: হ্যাঁ, আমি এটি বলতে চাইছিলাম: FILEONLYআমার জন্য এখানে প্রয়োজন হবে বলে মনে হয় না। যা ডিফুনকে check-declareস্বীকৃতি দেয় বলে মনে হয় increase-count। ;-)
ড্রয়

3

আমি মধ্যে প্রশ্নে সংজ্ঞা স্থাপন বিশ্বাস eval-and-compileএছাড়াও হবে কৃত্রিম স্টিফান এর হিসাবে একই ফলাফল অর্জন সঠিক উত্তর :

(eval-and-compile
  (let ((count 0))
    (defun increase-count ()
      (interactive)
      (setq count (1+ count))
      (message "Count is: %d" count))))

আমি অবশ্য ব্যবহারের সূক্ষ্মতার সাথে সবেমাত্র পরিচিত eval-and-compileএবং তদুপরি, এই পদ্ধতির কোনও উপায়ে উচ্চতর হওয়ার আশা করি না।

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