کد محیط ریبرگ در نشانی گیتهاب https://github.com/aroberge/reeborg قرار دارد.
هشدار
کد ریبرگ در حال تغییر است و ممکن است ناپایدار باشد. هدفم این است که محیط ریبرگ را تا آنجایی که ممکن است برای فراگیران و مدرّسها بهینه کنم. اغلب وبگاهها و ابزارهایی را که آموزش برنامهنویسی پیدا میکنم از رویکرد تجویزی محدود به «مسیر یادگیری» پیروی میکنند که انعطاف پذیری کمی به فراگیران میدهد و در نتیجه همان طور که هست مورد مدرّسها قرار میگیرد. من تلاش کردم رویکرد مخالف را در پی بگیرم. وقتی مدرّسهایی با با من تماس میگیرند که میخواهند کار X را انجام دهند؛ اگر از قبل راهی برای انجام آن کار نباشد، سعی میکنم روشی برایشان ایجاد کنم. در نتیجه، ویژگیهای جدید به طور مداوم افزوده میشوند و تقریباً فوراً به وبگاه مینشینند.
قبل از این هر اقدام جدّی روی آن، شاید بخواهید با من تماس بگیرید تا از به روز بود اطّلاعات داده شده در اینجا اطمینان حاصل کنید.
آزمونهای واحد سنّتی وجود ندارند.
با این حال، چندتایی شبه آزمون واحدی (با QUnit) و آزمونهایی مفصّل ادغامی هستند که از داخل مرورگر اجرا میشوند. برای دیدن آنها خط زیر را اجرا کنید:
World("/test/worlds/main_py_en.json")
فایل html اصلی https://github.com/aroberge/reeborg/blob/master/world.html است.
با یاددشتی کردن و خارج کردن از حالت یادداشت چندتا سطرها میتوانید آنها طور تغییر دهید، تا بدون دسترسی به هیچ اینترنتی به جای فایلهای برخط، با فایلهای روی سیستم خودتان کار کند.
اگر به کد منبع نگاهی بیاندازید، باید واضح باشد که کدام یک از سطرها لازم است تغییر داده شوند.
در دست انجام
علاوه بر نسخهٔ انگلیسی دنیای ریبرگ یعنی فایل world.html، یک فایل فرانسوی (monde.html)، یک کرهای (world_ko.html) و یک فارسی آن (world_fa.html)هم هست. در حال حاضر برنامه دارم یک تک فایل با انتخابگر زبان ایجاد کنم که به کاربر اجازهٔ تغییر به نسخهٔ دیگر بدون بارگذاری صفحه را بدهد.
به عنوان بخشی از این تغییر برنامهریزی شده، میخواهم فرآیند ساخت و ایجاد یک نسخهٔ جدا را که بتواند واخط اجرا شود را خودکار سازی کنم.
فایلهای اصلی جاوا اسکریپت در https://github.com/aroberge/reeborg/tree/master/src/js قرار دارند. کد به چند فایل تقسیم میشود که در نهایت در یک فایل تجمیع میشوند (https://github.com/aroberge/reeborg/blob/master/src/js/reeborg_dev.js) که با وسیلهٔ فایل html بارگذاری میشود. این تجمیع با استفاده از یک فایل مجموعهٔ خط فرمان ویندوز انجام میشود. من راهی بین سیستم عاملی (با استفاده از اسکریپت پایتون) برای انجام این کار پیدا نکردم.
در دست انجام
بنا دارم ان قسمت را تغییر دهم و از browserify استفاده کنم، و بیشتر از دست فضای نام عمومی RUR خلاص شوم.
توجّه داشته باشید که هیچ گونه کوچک سازی اتّفاق نمیافتد. انگیزهٔ اصلی من راحتتر کردن کاوش کد بود. مثلاً در محیط ریبرگ زبان جاوا اسکریپت را به عنوان زبان برنامهنویسی انتخاب و این برنامه را اجرا کنید:
view_source_js(RUR.control.turn_left)
خواهید دید که کد آن تابع از مد منبع استخراج میشود و در یک نمونهٔ CodeMirror درج میشود در حالی که قالبگذاری آن دست نخورده مانده. اگر بخواهید همین کار را از پایتون انجام دهید، مقداری کد جاوا اسکریپت خواهید دید که با برایتون ترجمه شده ... که آن قدرها مفید نخواهد بود.
در دست انجام
این قسمت احتمالاً موقع استفاده از browserify تغییر خواهد کرد. با این همه ظاهراً CodeMirror افزونهای دارد که قالب بندی کد را ممکن میکند. بنا دارم استفاده از این افزونه را هنگام فراخوان`view_source_js` بررسی کنم. این کار در حالی که به من اجازهٔ ریز کردن کد را میدهد، به بقیّه هم این امکان را میدهد که باز هم یک نسخهٔ قابل خواندن کد را ببینند.
فایلهای جاوا اسکریپت اختصاصی زبان انسان در https://github.com/aroberge/reeborg/tree/master/src/lang پیدا میشوند.
اگر با پایتون کار میکنید از میزفرمان جاوا اسکریپت مرورگر استفاده کنید و این مورد را تعریف کنید:
RUR.__debug = any_value # پیشنهاد میدهم از غلط استفاده کنید
در نتیجه، نسخهٔ تغییر یافتهٔ برنامهٔ کاربر شامل اطّلاعات برجسته کاری اطّلاعات در میزفرمان چاپ خواهد شد. این کار وقتی که هنگام برجسته کردن کدها خطایی اتّفاق بیافتد مفید خواهد بود. در صورتی که هنگامی که خاموش است انی طور نیست.
اگر مقدار``RUR.__debug`` به هر مقدار درستی تعیین شود، اطّلاعات اضافی در میزفرمان جواوا اسکریپت چاپ میشود. هر از گاهی اگر بخواهم اجرای برنامه را رهگیری کنم تا به یافتن خطایی کمک کنید از این قابلیّت استفاده میکنم.
اطّلاعات داده شدهٔ این قسمت احتمالاً برای شروع شما کافیست. لطفاً راحت باشید و اگر سؤالی داشتید با من تماس بگیرید.
به صورت معمول چهار فاصله برای تورفتگی به کار میرود. توجّه داشته باشید که برخی از فایلهای جاوا اسکریپت ممکن اس از دو فاصله استفاده کرده باشند. هنگام بازسازی کد باید این مورد را برای تابعی که روی آن کار میکنید تغییر دهید.
در حال حاضر، پشتیبانی برنامهنویسی با پایتون جاوا اسکریپت و ظاهر جورچینی وار با هر دو زبان فرانسوی و انگلیسی وجود دارد. دستور move()
را در نظر بگیرید. وقتی در برنامهٔ یک کاربر به کار میرود تابعی را نسبتاً پیچیده ( فعلاً RUR.control.move()
) با ۱۰۰ سطر کد را فرا می خواند. چون باید بررسی کند آیا حرکت مجاز است (مثلاً شیئی راهش را مسدود نکرده و ...) فرض کنید من به این نتیجه میرسم که باید کد را دوباره سازی کنم (که خیلی هم انجامش دادهام) که در نتیجه که این تابع نام متمایزی باید داشته باشد (شاید چیزی مثل RUR.instructions.move()
) یا با متغیّر مستقلّ (مخفی) دیگری فرا خوانده بشود. فرض کنید نسخهٔ نهایی این فرمان تابع را مثل این تعریف کردهام:
def move():
"""Move forward, by one grid position."""
RUR.control.move(RUR.current_world.robots[0])
با تعریفهای مشابه برای نسخهٔ جاوا اسکریپت، نسخهٔ جورچینی (هم پایتونی و هم جاوا اسکریپت)، میباید تغییری اسمی در ۴ جای مختلف نسخهٔ انگلیسی ایجاد کنم. چهار تغییر هم میبایست برای نسخهٔ فرانسوی ایجاد شود. و چهار تغییر هم در برای هر زبان انسانی دیگر. برای جلوگیری از انجام همهٔ این تغییرات، رابطی مثل این (در حال حاضر در commands.js) ایجاد کردهام:
RUR._move_ = function () {
RUR.control.move(RUR.current_world.robots[0]);
};
و بعدش هم این را داریم:
def move():
"""حرکت به جلو به اندازهٔ یک خانه"""
RUR._move_()
اینطوری میتوانم «باطن » کد را بدن نیاط به تغییر نسخههای مختلف استفاده شده در برنامهٔ نهایی کاربر تغییر داده و یا بازسازی کنم.
در دست انجام
من در حال کار روی مجموعه ابزارهایی برای راحت تر کردن کار ترجمه به بقیّهٔ زبانهای انسانی بودم. این ابزارها همچینین مقایسهٔ نسخههای مختلف زبانها را راحتتر میکنند. بدون نیاز به داشتن تابعها و یا شگردهایی که به همان ترتیب در فایلهای مختلف ظاهر میشوند، همان طور که این موردی است که وقتی یکی بخواهد از برنامهٔ diff برای مقایسهٔ نسخهها استفادهع کند.