मैंने पर अपनी शुरुआत की अपनी खुद की सूची बनाएं और एक ही समस्या में भाग गया। उपर्युक्त उत्तरों में से कोई भी मेरे लिए काम नहीं करता है। एक छोटे से शोध के बाद मुझे पता चला कि मैकोज़ में gnu रीडलाइन लाइब्रेरी नहीं है जो रीडलाइन फ़ंक्शंस प्रदान करती है, मैकओ के विभिन्न संस्करण एडिटलाइन नामक लाइब्रेरी का उपयोग करके रीडलाइन के अनुकरण प्रदान करते हैं। शुरू करने के लिए ...
man editline
#include <histedit.h>
ठीक है, editline आप लाइन इनपुट और इतिहास, और कार्यों उन पर संचालित करने के लिए कुछ structs देता है। सबसे पहले आपको इन structs को तुरंत चालू करना होगा। संपादन के लिए प्रलेखन बहुत उपयोगी नहीं है क्योंकि इसमें कोई उदाहरण नहीं है। ऐप्पल हेडर फ़ाइल उपलब्ध कराता है ताकि थोड़ा सा मदद मिल सके। http://www.opensource.apple.com/source/libedit/libedit-13/src/histedit.h
मैं इसके लिए नया हूं और यह अभी भी मेरे लिए बहुत भ्रमित था। डेबियन पैकेज के रूप में उपलब्ध libedit के लिए स्रोत कोड का कुछ संस्करण है। सौभाग्य से किसी से भी बुद्धिमान मैं पहले से ही इसमें खोला है और lbedit का उपयोग कर एक कमांड लाइन लागू किया है। उनका कोड यहां है: https://www.cs.utah.edu/~bigler/code/libedit.html। मैंने श्री बिगलर का कोड लिया, और से कोड अपनी खुद की सूची बनाएं, और इसे प्राप्त करने के लिए उन्हें एक साथ रखें।
/* repl-macos.c
* Repl code example from builyourownlisp.com
* Modified by NB aug 2017
* Code example for editline from
* www.cs.utah.edu/~bigler/code/libedit.html
*/
#include <stdio.h>
#include <string.h>
#include <histedit.h>
char* prompt(EditLine *e){
return "lispy> ";
}
int main(int argc, char** argv){
EditLine *el; // Line editor state
History *herstory; // the rest is history
// Temp Variables
int count;
const char *usrin;
int keepreading = 1;
HistEvent ev;
// Initialize the editline state
el = el_init(argv[0], stdin, stdout, stderr);
el_set(el, EL_PROMPT, &prompt);
el_set(el, EL_EDITOR, "emacs");
// Initialize history
herstory = history_init();
if(!herstory){
fprintf(stderr, "Couldn't initialize history\n");
return 1;
}
//set history size
history(herstory, &ev, H_SETSIZE, 800);
// Set up the call back functions for history functionality
el_set(el, EL_HIST, history, herstory);
puts("Begin moLisp interpreter");
puts("Type 'exit' at prompt to exit");
while(keepreading){
usrin = el_gets(el, &count);
// add the command to the history, and echo it back to the user
if(count > 0){
history(herstory, &ev, H_ENTER, usrin);
if(strcmp(usrin, "exit\n"))
printf("No, You're a %s", usrin);
else{
puts("bye");
--keepreading;
}
}
}
// Clean up memory
// by freeing the memory pointed to within the structs that
// libedit has created.
history_end(herstory);
el_end(el);
return 0;
}
नोटिस: structs कि उपयोग किया जाता है की इन्स्टेन्शियशन जबकि पाश के बाहर होता है, और इसलिए कार्यों कि स्मृति उन structs का उपयोग कर रहे मुक्त करते हैं। इस वजह से, मैंने बाहर निकलने के लिए कमांड जोड़ा, अन्यथा मुझे लगता है कि अगर लूप से बाहर निकलने का एकमात्र तरीका प्रोग्राम को बाधित कर रहा है तो स्मृति मेमोरी है। संकलन करने के लिए:
gcc repl-macos.c -ledit -Wall -o repl-edit
-ledit editline
से जोड़ने के लिए है, तो यह किसी भी प्रासंगिकता, मैं MacOS 10.4.11 का उपयोग कर रहा है की जरूरत है और यहाँ है मेरी संकलक, gcc --version
के उत्पादन में है पावरपीसी-सेब-डार्विन 8-जीसीसी-4.0.0 (जीसीसी) 4.0.0 20041026 (ऐप्पल कंप्यूटर, इंक बिल्ड 4061)
अब इसके साथ एकमात्र समस्या है, और पुस्तक यह इंगित करता है, सी-कोड पोर्टेबल माना जाता है और यह नहीं है। अगला चरण प्रीप्रोसेसर निर्देशों को जोड़ना होगा ताकि यह लिनक्स पर रीडलाइन और मैक पर एडिटलाइन का उपयोग करे।
बस इसे चलाया। मैं इसकी प्रशंसा करता हूँ! मैं एक सी नोब हूँ। धन्यवाद :) – yburyug
आर्किटेक्चर x86_64: "_add_history" के लिए अनिर्धारित प्रतीक, संदर्भित: _main प्रॉम्प्ट-ओवाईएसओटीआई में।ओ "_readline", से संदर्भित: में _main शीघ्र-OYsOTI.o ld: प्रतीक (रों) वास्तुकला x86_64 बजना के लिए नहीं मिला: त्रुटि: लिंकर आदेश से बाहर निकलें कोड 1 के साथ विफल (उपयोग -v मंगलाचरण देखने के लिए) –
@ विनीट: क्या आपने अपनी परियोजना के लिंक पुस्तकालयों में "libedit.dylib" जोड़ा था? (प्रश्न में '-ledit' विकल्प यही है।) –