HyperTalk supported the basic control structures of procedural languages: repeat for/while/until, if/then/else, as well as function and message "handler" calls (a function handler was a subroutine and a message handler a procedure). Data types usually did not need to be specified by the programmer; conversion happened transparently in the background between strings and numbers. There were no classes or data structures in the traditional sense; in their place were special string literals, or "lists" of "items" delimited by commas (in later versions the "itemDelimiter" property allowed choosing an arbitrary character). Code execution typically began as a response to an event such as a mouse click on a UI widget.
In the late 1980s, Apple considered[1] using HyperCard's HyperTalk scripting language as the standard language across the company and within its classic Mac OS operating system, as well as for interprocess communication between Apple and non-Apple products. The company did not oppose the development of imitations like SuperCard, but it created the HyperTalk Standards Committee to avoid incompatibility between language variants.[1] The case-insensitive language was initially interpreted, but gained just-in-time compilation with HyperCard 2.0.[2]
Description
Fundamental operations
For most basic operations including mathematical computations, HyperTalk favored natural-language ordering of predicates over the ordering used in mathematical notation. For example, in HyperTalk's put assignment command, the variable was placed at the end of the statement:
put5*4intotheResult
whereas in the more traditional BASIC programming language (and most others), the same would be accomplished by writing:
theResult=5*4
The HyperTalk code has the side-effect of creating the variabletheResult on the fly. Scripts could assign any type or value to a variable using the put command, making HyperTalk veryweakly typed. Conversions between variable types were invisible and automatic: the string "3" could be multiplied by the number 5 to produce the number 15, or the number 5 concatenated onto the string "3" to produce the string "35". HyperTalk would not complain unless the types could not be automatically converted.
The language's flow control and logic were generally similar to other common languages, using an if ... then ... else ... end if structure for conditionals and supporting loops based on a flexible repeat ... end repeat syntax. Comments were prefaced with two minus signs: -- this is a comment.
Objects, containers and scripts
HyperCard's primary user interface concept was the card, a display system that emulated an index card. Cards were normally used to store information, similar to a record in a conventional flat-file database. The graphical layout of the card was created using the mouse by placing various elements on the card, such as text fields and buttons. A master layout "card" known as the background was shown behind the transparent areas of each card. Objects placed on the background, such as fields and buttons, would be shared as a common layout among several cards, but with card-specific content. The collection of cards, backgrounds and the associated data stored in them were stored in a single file known as the stack (of cards). Collectively, all of these data-containing objects are referred to as containers.
HyperTalk functions, or scripts, were normally stored within the script property available in many of the stack's containers. Scripts could access the properties of a container, corresponding to instance variables, using the get and set instructions. The script property held plain text and had no special properties; scripts could be placed in, and run from, any text container, including string variables,[a] or imported from other stacks using the start using command. A script could even be user-provided text typed into an on-screen text field. Arbitrary text could be executed using the do command, in a manner similar to Dynamic SQL.[3]
Referring to containers
A key concept in HyperTalk was the way it referred to containers through a navigational system based on the visual hierarchy of the stack. Every container in the stack was given a unique ID number when created and could also be given an optional name. Scripts could refer to objects by using either of these identifiers, along with an object type specified using the of operator. This operator used a natural language syntax making for easily readable, self-documenting code. For instance, a script stored in a button on a card might wish to take user-supplied text gathered using a text field and store the text in a variable called theValue:
putthevalueofcardfield"typehere"intotheValue
Various contextual aspects of statements could be inferred by the interpreter. In the statement above, for example, because the script would be running in the context of a button on a specific card, the identifier card was understood to refer to the card the user was interacting with, even though the button itself would normally be on the background. In addition, "the value" (the text submitted by the user) was assumed to be the main property and to be the target of operations if not otherwise specified. Likewise, "card field" was assumed to be the target of the command, as opposed to the background field, so that information could also be omitted. Even container types had short forms that programmers could use to save typing. Thus the code above is equivalent to the shorter form:
putfld"typehere"intotheValue
Objects within a given context—the card or background, for instance—were also given a runtime number based on their z-order on the screen. To assist in using their position for navigation, HyperTalk also included a variety of ordinal and cardinal referencing systems to simplify the syntax further. Assuming the field "typehere" is the only field on the card, the code above could also be written:
putthefirstcardfieldintotheValue
or:
putcardfield1intotheValue
The choice of addressing style was left to the programmer; often different styles were used in different statements depending on the style of the surrounding code in order to make the code more readable.
HyperTalk included the me container which acted in the same fashion as the self qualifier found in most object-oriented languages, allowing simple access to the current container object. Less common was the it variable, which held the value of the last operation for certain built-in operators. For example:
ask"What is the value?"putitintocardfield"display"
This example uses the ask command to display a dialog box and capture the text typed into an accompanying text field; when the dialog is completed by hitting Return or clicking OK, the value is assigned to the it pseudo-variable. The second line then copies that value into a card field using the put assignment operator.
Collections
Containers of a given type were also available as collections with a pluralized version of that container type as its name—the collection of the fields on a card was card fields. These collections were themselves containers with their own properties. Key among these was the number property which was widely used during iterations and similar tasks. For instance, if one wanted to hide all the fields on a card, this could be accomplished with this code:
This code exposes another common feature of HyperTalk: that a property might have several names and operators. In this case the hide command, and the associated show, act by setting the value of the container's visible property. Thus hide field i is exactly equivalent to setthevisibleoffielditofalse. A similar example was the lock screen command that stopped visual updating, which was a short form for setthelockscreentotrue, where lockscreen is a property of HyperCard itself—also a container. Many examples of this sort of syntactic sugar were found in HyperTalk, in order to simplify the syntax and improve readability of common code.
In HyperCard 2.2 and later, the collection of collections was also available as a container's parts. This allowed a script to address all of the objects in a container with a single iterator.
Handling text
A notable feature of the HyperTalk container model was its handling of text. Every collection of text, whether a literal string in a program or text typed into a text field, was itself considered a container with multiple collections of containers within it. This allowed scripts to parse text using the same navigational commands as any other container. For instance, while parsing a space-delimited data file, one might want to extract the third column, like this:
putthethirdwordoftheFilesTextintocolThree
This syntax allowed the script to "walk" down the text to find particular data, as in this example:
This process of treating text as a container was known as "chunking", and the functions as "chunk expressions". These same sorts of expressions were used to handle file manipulation, along with a set of file management functions. The following code opens a known file, reads from it, extracts data, and then closes the file:
onmouseDownanswerfile"Please select a text file to open."ifitisemptythenexitmouseDownputitintofilePathifthereisafilefilePaththenopenfilefilePathreadfromfilefilePathuntilreturnputitintocdfld"some field"closefilefilePathsetthetextStyleofcharacter1to10ofcardfield"some field"toboldendifendmouseDown
HyperTalk also included functions for chunking strings using a substring-find operation using the in operator. The following code finds all examples of a given pattern using the in as part of the repeat loop, while offset finds the location of that pattern within the string:
HyperTalk used the same chunking system to produce structures like arrays or lists. Such a structure would be created by placing multiple data items in a variable, separated by commas. Various types of data could be imported into a HyperTalk script using strings that would get parsed as required. For instance, the position of objects on the screen was defined by a pair of numbers representing the X and Y coordinates relative to the upper left corner. The following code creates a variable called pos that holds a coordinate pair, and then manipulates this to re-position all of the buttons on a card in a diagonal from top-left to bottom-right:
The item chunking expression was originally based on a comma delimiter, but later versions of HyperCard changed this to the value of itemDelimiter, offering the ability to parse arbitrary lists and structures.
Messages and events
HyperTalk used an object-oriented concept for calling scripts, with objects in the stack sending "events" as messages that would be processed by handlers that declared their interest in receiving the events using the on syntax. For instance, most GUI containers would send the mouseDown message when the mouse button was clicked down, and then a mouseUp message when it was released while still on top of that container, and a script could capture these events like this:
onmouseUp-- place additional code hereendmouseUp
Messages for events were first sent to the script in the object that created the event, for instance, if the user clicked on a button the mouseUp message was first sent to that button. If the button's script object did not have a mouseUp handler (or no script at all), it was then passed to the card, the background, the stack, any stacks whose scripts had been explicitly imported using the start using command, the "home stack" (a user-selected always-open HyperCard stack), and finally to the HyperCard application itself.
For many simple events like mouse clicks on buttons the script would be placed directly within the object in question, the button itself. For instance, one might use the example code above within a button handler in this fashion:
In the case where code was being called from multiple locations, or it was being used as a global handler for an event, the script could determine the original sender of the event using the target function. Likewise, scripts could send events to other containers using the send command and then using the navigational code to refer to the container holding that handler's code:
send"mouseUp"tocardbutton"OK"ofcard"Veracity"
Combining HyperTalk's string processing with the do command allowed for the construction of interactive interpreters by placing a text field on a card and then placing this code in the field's script:
clickLine is a global property that returns the name and line number of the last field clicked, in a form like line10ofcardfield4. This code first selects all of the text on the clicked line, then extracts the line number into a local variable, then uses do to run the text as a HyperCard script.
The mouseDown message was sent to a button when the user clicked it, and mouseUp was sent when the user released the mouse inside it to trigger its action. Similarly, HyperCard sent periodic idle message, mouseEnter, mouseLeave, ... and various other messages related to navigation between different cards in a HyperCard stack, as well as user input (keyDown, functionKey, ...), and system events. As far as the scripters were concerned, there were no main event loops like in other procedural programming languages.
Controlling HyperCard
Unlike general rapid application development platforms, HyperCard stacks always looked like stacks - the menu bar was HyperCard's and not the programmer's (by default—scripting could add, delete and modify menus), the single window was a fixed size (in early versions), and in certain cases, commands that were central to the operation were part of the application itself, and not directly available in HyperTalk itself.
A good example of this was the creation of new cards, which was part of the application, not directly accessible from the HyperTalk language itself. A new card could only be created using the New Card menu item, which could be simulated in code usingdoMenu "New Card". While HyperTalk called into menu commands, menu commands also invoked handlers in HyperTalk. To run custom code when the Copy menu item was selected, one would place a script in the stack using the on doMenu itemName handler, and then examine itemName to see if it was "Copy".
HyperTalk also provided script control over the built-in drawing tools, simply by scripting the needed changes in paint tools and simulating mouse movements using the drag from start to end and the click at position commands.
Forgiving semantics
One unique distinction between HyperCard's programming language HyperTalk and seemingly similar languages like AppleScript was that HyperTalk scripts were more lenient in what input they accepted.
Apart from the above implicit declaration of variables when a value was assigned to them, and the way values were implicitly converted between types (allowing you to e.g. ask for character 2 of 1234), HyperCard would also recognize certain expressions and extract sub-values from them.
For example:
puttheselectedLineofcardfield"Listbox"intotheSelection-- gives 'line 2 to 3 of card field "Listbox"'selectline1ofcardfield"Listbox"selectline(word2oftheSelection)ofcardfield"Listbox"select(theselectedLineofcardfield"Listbox")-- parentheses added for illustrative purposes only
or
playharpsichordcegplayharpsichord"c e g"put"c e g"intotheMelodyplayharpsichordtheMelody
While the end result felt similar to scripters as a Bash script's expansion of variables before parsing, this was special-case syntax and did not have the pitfalls where data would be evaluated as code. So for example, all of the following are syntax errors in the melody, not function calls:
playharpsichord"c e g()"put"c e() g"intotheMelodyplayharpsichordtheMelody
Extending HyperTalk
Although the HyperTalk language languished just like HyperCard itself, it interest was revived through its plugin protocol, so-called External Commands (XCMDs) and External Functions (XFCNs), which were native code containers attached to stacks (as Macintosh-specific resources) with a single entry point and return value. XCMDs and XFCNs could be called just like regular message and function handlers from HyperTalk scripts, and were also able to send messages back to the HyperCard application. Some XCMD authors added advanced features like full color support (ColorizeHC, HyperTint, AddColor), multiple special-purpose windows (Prompt, Tabloid, Textoid, Listoid, ShowDialog, MegaWindows), drag and drop support and various hardware interfaces to the language.
Descendants of HyperTalk
Various scripting languages have implemented a superset of HyperTalk (collectively known as xTalk):[4]
CompileIt!-Talk – A HyperCard stack and XCMD by Tom Pittman that allowed compiling native 68000 machine code (e.g. for XCMDs and XFCNs) from HyperTalk code, and calling the native Macintosh toolbox routines. CompileIt was bootstrapped, that is, later versions were compiled using earlier versions of itself.
Double-XX-Talk – Double-XX was a lightweight HyperCard clone that shipped as an addition to CompileIt! and allowed running XCMDs and XFCNs without HyperCard, and even included a small HyperTalk interpreter.
MediaTalk – The language of Oracle Media Objects, a descendant of Plus, and the first cross-platform HyperCard clone. Furthermore, the only one that was truly modular.
PlusTalk – The language of Plus, from Spinnaker Software (originally developed by Format Verlag), which was used as the basis for Oracle Media Objects.
SuperTalk – The language of SuperCard, the first HyperCard clone, by Bill Appleton. Appleton also wrote the popular World Builder adventure construction kit, and HyperDA.
Transcript (formerly revTalk and MetaTalk) – The language implemented in the LiveCode (formerly Revolution and MetaCard) software platform and development environment. MetaCard was an early Unix-originated HyperCard clone that ran on Classic Mac OS, Mac OS X, Windows, Linux and Solaris.
XION - Originally the language of an open-source HyperCard clone that never materialized. Now implemented as OpenXION.
xTalk - After development of the community version of Livecode was ceased by Livecode, the open source version was forked into what is now OpenXTalk. This fork is under development at the openxtalk.org website.
These clones and dialects (commonly referred to under the moniker of xTalk-languages) added various features to the language that are expected from a modern programming language, like exception handling, user-defined object properties, timers, multi-threading and even user-defined objects.
There are also languages whose syntax and structure show influences from HyperTalk, such as:
AppleScript – The main scripting language of Apple's Classic Mac OS, and still supported in macOS.
Lingo – The programming language of Macromedia Director started out with an xTalk-like syntax, although later versions went in a direction resembling JavaScript.
Hyperscript – A scripting language that is designed to used for readable inline scripting and locality of behaviour in HTML, interpreted by a Javascript extension.
Many method names first popularized by HyperTalk have been incorporated into later languages, such as the onmouseup event handler in JavaScript.[6] Although Asymetrix ToolBook is often also considered a HyperCard clone, its scripting language apparently bears little resemblance to HyperTalk.
See also
Inform 7 – a programming language with similarly English-like syntax
^Roman Knöll, Vaidas Gasiunas, Mira Mezini, "Naturalistic types", Onward! 2011: Proceedings of the 10th SIGPLAN symposium on New ideas, new paradigms, and reflections on programming and software, pp. 33–48, October 2011.
Pada nama Vietnam ini, nama keluarga-nya adalah Nguyen. Menurut kebiasaan Vietnam, tokoh ini dipanggil dengan nama pemberian-nya Lem. Nguyễn Văn LémJenderal Nguyễn Ngọc Loan mengeksekusi Nguyễn Văn Lém.Lahirs. 1931Meninggal1 Februari 1968 (usia 36)[1]Saigon, Republik VietnamPengabdian Front Pembebasan Nasional Vietnam SelatanPangkatKaptenPasanganNguyễn Thị Lộp Nguyễn Văn Lém (Vietnam: [ŋʷǐənˀ vān lɛ̌m]; 1931 atau 1932 – 1 Februari 1968), yang diseb...
متلازمة كبدية كلوية ينتمي الكبد إلى علم الأمراض، ولكن يتم التبديل في متلازمة هتش أر أس لأن الكلى تتبع علم الأنسجة. الصورة في الأعلى ثلاثية الألوان لحالة تليف الكبد في الكبد.صورة مجهرية لقسم من الكبد مرسومة بالأحمر والأزرق والأرجواني. تظهر كميات كبيرة من التليف وبالأزرق ال...
مسجد كامبونج سيبوت معلومات عامة القرية أو المدينة بانجر الدولة بروناي تاريخ بدء البناء 1994 المواصفات عدد المصلين 160 تعديل مصدري - تعديل مسجد كامبونج سيبوت أو مركز العبادة كامبونج سيبوت أحد مساجد بروناي . الموقع يقع مركز العبادة كامبونج سيبوت في منطقة كامبونج سيبوت، �...
Saint Kitts Saint ChristopherGeografia fisicaLocalizzazioneMar dei Caraibi Coordinate17°19′48″N 62°40′00″W / 17.33°N 62.666667°W17.33; -62.666667Coordinate: 17°19′48″N 62°40′00″W / 17.33°N 62.666667°W17.33; -62.666667 ArcipelagoPiccole Antille Superficie168 km² Altitudine massima1156 m s.l.m. Geografia politicaStato Saint Kitts e Nevis Centro principaleBasseterre (13.220) Fuso orarioUTC-4 DemografiaAbitanti35.000 Densità...
Francesco Toldo Informasi pribadiNama lengkap Francesco ToldoTanggal lahir 2 Desember 1971 (umur 52)Tempat lahir Padova, ItaliaTinggi 1,96 m (6 ft 5 in)Posisi bermain Penjaga GawangKarier junior1983–1985 USMA Caselle1985–1987 Montebelluna1987–1990 AC MilanKarier senior*Tahun Tim Tampil (Gol)1990–1993 Milan 0 (0)1990–1991 → Hellas Verona (pinjaman) 0 (0)1991–1992 → Trento (pinjaman) 38 (0)1992–1993 → Ravenna (pinjaman) 31 (0)1993–2001 Fiorentina 266 (...
India-related events during the year of 1874 This article needs additional citations for verification. Please help improve this article by adding citations to reliable sources. Unsourced material may be challenged and removed.Find sources: 1874 in India – news · newspapers · books · scholar · JSTOR (July 2023) (Learn how and when to remove this message) ← 1873 1872 1871 1874 in India → 1875 1876 1877 Centuries: 17th 18th 19th 20th 21st Deca...
This article has multiple issues. Please help improve it or discuss these issues on the talk page. (Learn how and when to remove these template messages) This article includes a list of general references, but it lacks sufficient corresponding inline citations. Please help to improve this article by introducing more precise citations. (May 2011) (Learn how and when to remove this message) This article relies largely or entirely on a single source. Relevant discussion may be found on the talk ...
Appling County, GeorgiaAppling County Courthouse di BaxleyLokasi di negara bagian GeorgiaLokasi negara bagian Georgia di Amerika SerikatDidirikan15 Desember 1818Asal namaDaniel ApplingSeatBaxleyKota terbesarBaxleyWilayah • Keseluruhan512 sq mi (1.326 km2) • Daratan507 sq mi (1.313 km2) • Perairan52 sq mi (135 km2), 1.0%Populasi • (2010)18,236 • Kepadatan36/sq mi (14/km²)Distrik ...
Indian newspaper DeshdootTypeDaily NewspaperFormatBroadsheetOwner(s)The Deshdoot Group of NewspapersFounder(s)Deokisan SardaPublisherThe Deshdoot Group of NewspapersLanguageMarathi, EnglishHeadquartersNashikCityNashik, Ahmednagar, Dhule, Jalgaon, NandurbarCountryIndiaSister newspapersSarvmat, Nagar TimesWebsitewww.deshdoot.comMedia of IndiaList of newspapers Deshdoot (Marathi देशदूत – messenger of the country) is an Indian daily newspaper, published in the Marathi language in th...
Local authority elections in Ireland 1920 Irish local elections ← 1914 January & June 1920 1924 (Northern Ireland)1925 (Irish Free State) → All 1806 councillors across Ireland First party Second party Third party Leader Éamon de Valera Thomas Johnson Edward Carson Party Sinn Féin Labour Irish Unionist Councillors 550 394 355 Elections were held in January and June 1920 for the various county and district councils of Ireland. The elections were organis...
هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (يونيو 2019) ستيف أرينغتون (بالإنجليزية: Steve Arrington)، و(بالإنجليزية: Steven R. Arrington) معلومات شخصية اسم الولادة (بالإنجليزية: Steven Ralph Arrington) الميلاد 5 مارس 1956 (68 سنة) �...
هذه المقالة يتيمة إذ تصل إليها مقالات أخرى قليلة جدًا. فضلًا، ساعد بإضافة وصلة إليها في مقالات متعلقة بها. (مارس 2024) أسبازيا (باللاتفية: Johanna Emīlija Lizete Rozenberga) معلومات شخصية الميلاد 4 مارس 1865 [1] الوفاة 5 نوفمبر 1943 (78 سنة) [2] دوبولتي مواطنة الإمبراطورية ا�...
Награды и номинации мультфильма«Как приручить дракона» За свою работу композитор Джон Пауэлл получил множество наград в различных категориях Награды и номинации Награда Победы Номинации «Золотой трейлер» 0 1 Teen Choice Awards 0 1 «Мировой саундтрек[англ.]» 0 2 Венецианский кино�...
N'Golo Kanté Kanté latihan bersama Prancis pada tahun 2018Informasi pribadiNama lengkap N'Golo Kanté[1]Tanggal lahir 29 Maret 1991 (umur 33)Tempat lahir Paris, Prancis[2]Tinggi 171 cm (5 ft 7 in)[2]Posisi bermain Gelandang tengahInformasi klubKlub saat ini Al-IttihadNomor 7Karier junior1999–2010 JS Suresnes2010–2012 BoulogneKarier senior*Tahun Tim Tampil (Gol)2011–2013 Boulogne 38 (3)2013–2015 Caen 75 (4)2015–2016 Leicester City 37 (1)...
Caravaggio, I bari, olio su tela, 1594 (Fort Worth, Kimbell Art Museum). Un gioco di carte è un qualunque gioco che necessita l'uso di carte da gioco, sia tradizionali sia specifiche per il gioco.[1] Indice 1 Descrizione 1.1 Posizionamento dei giocatori 1.2 Il mazzo 1.3 Distribuzione delle carte 2 Le regole 2.1 Infrazioni delle regole 3 Elenco di giochi di carte 3.1 Giochi tradizionali italiani 3.2 Giochi internazionali 3.3 Giochi con figure 3.4 Giochi di carte collezionabili 3.5 Gio...
Voce principale: Piacenza Calcio 1919. Piacenza Football ClubStagione 2005-2006Sport calcio Squadra Piacenza Allenatore Giuseppe Iachini Presidente Fabrizio Garilli Serie B11º posto Coppa Italiaterzo turno preliminare Maggiori presenzeCampionato: Riccio (39)Totale: Riccio (42) Miglior marcatoreCampionato: Cacia (18)Totale: Cacia (21) StadioLeonardo Garilli Maggior numero di spettatori7.545 vs Cremonese[1] Minor numero di spettatori3.700 vs AlbinoLeffe[1] Media spettator...
Imperial Roman legion Map of the Roman empire in AD 125, under emperor Hadrian, showing the Legio VIII Augusta, stationed on the river Rhine at Argentorate (Strasbourg, France), in Germania Superior province, from AD 75 to at least 371 Coin showing Claudius and Aquila of the V and VIII legions Aureus struck in 193 by Septimius Severus to celebrate VIII Augusta, one of the legions supporting his fight for purple. Legio VIII Augusta (Augustus' Eighth Legion) was one of the oldest legions of the...
Disciple and betrayer of Christ Not to be confused with Jude the Apostle. This article is about the biblical figure. For the black metal band, see Judas Iscariot (band). Judas and Iscariot redirect here. For other uses, see Judas (disambiguation) and Iscariot (disambiguation). Judas IscariotJudas' Remorse (1880) by Almeida JúniorPersonalBorn1st centuryPossibly Kerioth, Judaea, Roman EmpireDiedAD 31Jerusalem, Judea, Roman EmpireCause of deathSuicide by hanging or accidental death from fallRel...
Scagnello komune di Italia Tempat NegaraItaliaDaerah di ItaliaPiemonteProvinsi di ItaliaProvinsi Cuneo NegaraItalia Ibu kotaScagnello PendudukTotal173 (2023 )GeografiLuas wilayah9,39 km² [convert: unit tak dikenal]Ketinggian748 m Berbatasan denganBattifollo Ceva Lisio Mombasiglio Monasterolo Casotto SejarahSanto pelindungYohanes Pembaptis Informasi tambahanKode pos12070 Zona waktuUTC+1 UTC+2 Kode telepon0174 ID ISTAT004216 Kode kadaster ItaliaI484 Lain-lainSitus webLaman resmi Sca...
هذه المقالة بحاجة لصندوق معلومات. فضلًا ساعد في تحسين هذه المقالة بإضافة صندوق معلومات مخصص إليها. إجازة من هيئة اختصاص[1] أو شهادة البورد (بالإنجليزية: Board certification) هي العملية التي من خلالها يصبح الطبيب أو غيره من أصحاب الشهادات والمهن قادراً على امتلاك المعارف والمها�...